結果
| 問題 |
No.922 東北きりきざむたん
|
| コンテスト | |
| ユーザー |
pockyny
|
| 提出日時 | 2019-11-08 23:07:12 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,412 bytes |
| コンパイル時間 | 1,031 ms |
| コンパイル使用メモリ | 85,572 KB |
| 最終ジャッジ日時 | 2025-01-08 02:52:45 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 4 WA * 22 |
ソースコード
#include <iostream>
#include <vector>
#include <map>
using namespace std;
const int LOG = 22;
vector<int> G[100010],ver[100010];
int parent[25][100010];
long long d[100010];
void dfs(int v, int p){
for(int x:G[v]){
if(x==p) continue;
parent[0][x] = v;
d[x] = d[v] + 1;
dfs(x,v);
}
}
void init(int v,int root){
d[root] = 0; parent[0][root] = -1;
dfs(root,-1);
for(int k=0;k+1<LOG;k++){
for(int i:ver[v]){
if(parent[k][i]<0){
parent[k+1][i] = -1;
}else{
parent[k+1][i] = parent[k][parent[k][i]];
}
}
}
}
int lca(int u, int v){
if(d[u]>d[v]) swap(u,v);
for(int k = 0;k<LOG;k++){
if((d[v] - d[u]) & (1<<k)){
v = parent[k][v];
}
}
if(u==v) return u;
for(int k = LOG-1;k>=0;k--){
if(parent[k][u]!=parent[k][v]){
u = parent[k][u];
v = parent[k][v];
}
}
return parent[0][u];
}
long long dist(int u, int v){
int z = lca(u,v);
return d[u] + d[v] - 2*d[z];
}
int par[100010],sz[100010];
void unite_init(int n){
for(int i=0;i<n;i++){
par[i] = i; sz[i] = 1;
}
}
int find(int x){
if(par[x]==x) return x;
return par[x] = find(par[x]);
}
void unite(int x, int y){
x = find(x); y = find(y);
if(x==y) return;
if(sz[x]<sz[y]) swap(x,y);
sz[x] += sz[y]; par[y] = x;
}
bool same(int x, int y){
return find(x)==find(y);
}
map<int,long long> ma[100010];
int dp[100010];
int dfs2(int v, int p){
int ret = 0,x = find(v);
if(ma[x].find(v)!=ma[x].end()){
ret += ma[x][v];
}
for(int u:G[v]){
if(u==p) continue;
ret += dfs2(u,v);
}
dp[v] = ret;
return ret;
}
int search(int v,int p){
int mx = -1,sum = 0,j = -1;
for(int u:G[v]){
if(u==p) continue;
if(mx<dp[u]){
mx = dp[u];
j = u;
}
sum += dp[u];
}
if(mx*2>sum) return search(j,v);
return j;
}
int main(){
int i,n,m,q;
cin >> n >> m >> q;
unite_init(n);
for(i=0;i<m;i++){
int u,v;
cin >> u >> v; u--; v--;
G[u].push_back(v);
G[v].push_back(u);
unite(u,v);
}
for(i=0;i<n;i++){
ver[find(i)].push_back(i);
}
for(i=0;i<n;i++){
if(par[i]==i){
init(find(i),find(i));
}
}
long long ans = 0;
for(i=0;i<q;i++){
int a,b; cin >> a >> b;
a--; b--;
if(same(a,b)){
ans += dist(a,b);
}else{
ma[find(a)][a]++; ma[find(b)][b]++;
}
}
for(i=0;i<n;i++){
if(par[i]!=i) continue;
if(ma[find(i)].size()==1) continue;
dfs2(i,-1);
int z = search(i,-1);
for(auto v:ma[find(i)]){
ans += v.second*dist(v.first,z);
}
}
cout << ans << endl;
}
pockyny