結果
| 問題 |
No.922 東北きりきざむたん
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2019-11-08 21:52:49 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,602 bytes |
| コンパイル時間 | 1,221 ms |
| コンパイル使用メモリ | 114,068 KB |
| 実行使用メモリ | 20,736 KB |
| 最終ジャッジ日時 | 2024-09-15 01:26:00 |
| 合計ジャッジ時間 | 5,154 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 4 WA * 22 |
ソースコード
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#include <utility>
#include <functional>
#include <time.h>
#include <stack>
#include <array>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<ll, ll> P;
vector<int> g[100010];
vector<int> w[100010];
int par[17][100010];
int comp[100010];
int c;
int n;
int r[100010];
int d[100010];
void dfs0(int x, int p){
comp[x]=c;
w[c].push_back(x);
for(auto y:g[x]){
if(p==y) continue;
par[0][y]=x;
d[y]=d[x]+1;
dfs0(y, x);
}
}
void build(){
for(int i=1; i<17; i++){
for(int j=0; j<n; j++){
par[i][j]=par[i-1][par[i-1][j]];
}
}
}
int lca(int a, int b){
if(d[a]>d[b]) swap(a, b);
int dd=d[b]-d[a], i=0;
int a1=a, b1=b;
while(dd){
if(dd&1) b1=par[i][b1];
dd>>=1;
i++;
}
if(a1==b1) return a1;
for(int j=17-1; j>=0; j--){
if(par[j][a1]!=par[j][b1]){
a1=par[j][a1], b1=par[j][b1];
}
}
return par[0][a1];
}
int dist(int a, int b){
return d[a]+d[b]-2*d[lca(a, b)];
}
int cnt[100010];
void dfs1(int x, int p){
for(auto y:g[x]){
if(y==p) continue;
dfs1(y, x);
cnt[x]+=cnt[y];
}
}
int cent[100010];
int main()
{
int m, q;
cin>>n>>m>>q;
for(int i=0; i<m; i++){
int u, v; cin>>u>>v;
u--; v--;
g[u].push_back(v);
g[v].push_back(u);
}
int a[100010], b[100010];
for(int i=0; i<q; i++){
cin>>a[i]>>b[i];
a[i]--; b[i]--;
}
fill(comp, comp+n, -1);
for(int i=0; i<n; i++){
if(comp[i]==-1){
r[c]=i;
par[0][i]=i;
dfs0(i, -1);
c++;
}
}
ll ans=0;
for(int i=0; i<q; i++){
if(comp[a[i]]==comp[b[i]]){
ans+=dist(a[i], b[i]);
}else{
cnt[a[i]]++;
cnt[b[i]]++;
}
}
for(int i=0; i<c; i++){
dfs1(r[i], -1);
int tot=cnt[r[i]];
for(auto x:w[i]){
bool dame=0;
for(auto y:g[x]){
if(x!=r[i] && par[0][x]==y){
if(tot-cnt[x]>tot/2){
dame=1;
break;
}
}else{
if(cnt[y]>tot/2){
dame=1;
break;
}
}
}
if(!dame){
cent[i]=x;
break;
}
}
}
for(int i=0; i<q; i++){
if(comp[a[i]]!=comp[b[i]]){
ans+=dist(cent[comp[a[i]]], a[i])+dist(cent[comp[b[i]]], b[i]);
}
}
cout<<ans<<endl;
return 0;
}
chocorusk