結果
| 問題 |
No.922 東北きりきざむたん
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-11-08 22:41:03 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,150 bytes |
| コンパイル時間 | 787 ms |
| コンパイル使用メモリ | 76,820 KB |
| 実行使用メモリ | 818,048 KB |
| 最終ジャッジ日時 | 2024-09-15 01:53:55 |
| 合計ジャッジ時間 | 4,968 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | MLE * 1 -- * 3 |
| other | -- * 26 |
コンパイルメッセージ
main.cpp: In function 'int dfs(int, int, int)':
main.cpp:45:1: warning: no return statement in function returning non-void [-Wreturn-type]
45 | }
| ^
main.cpp: At global scope:
main.cpp:94:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
94 | main()
| ^~~~
ソースコード
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#include<vector>
struct UF{
int n;
vector<int>parent,rank;
UF(int n_=0):n(n_),parent(n_),rank(n_,1)
{
for(int i=0;i<n_;i++)parent[i]=i;
}
int find(int a){return parent[a]!=a?parent[a]=find(parent[a]):a;}
bool same(int a,int b){return find(a)==find(b);}
bool unite(int a,int b)
{
a=find(a),b=find(b);
if(a==b)return false;
if(rank[a]<rank[b])
{
parent[a]=b;
rank[b]+=rank[a];
}
else
{
parent[b]=a;
rank[a]+=rank[b];
}
return true;
}
int size(int a){return rank[find(a)];}
};
int N,M,Q;
vector<int>G[1<<17];
int parent[17][1<<17];
int depth[1<<17];
int dfs(int u,int d,int p)
{
depth[u]=d;
parent[0][u]=p;
for(int v:G[u])
{
if(v!=p)dfs(v,d+1,u);
}
}
int lca(int u,int v)
{
if(depth[u]>depth[v])swap(u,v);
int d=depth[v]-depth[u];
for(int k=16;k>=0;k--)
{
if(d>>k&1)v=parent[k][v];
}
if(u==v)return u;
for(int k=16;k>=0;k--)
{
if(parent[k][u]!=parent[k][v])
{
u=parent[k][u];
v=parent[k][v];
}
}
return parent[0][u];
}
int x[1<<17];
int ccnt[1<<17];
long dis[1<<17];
void dfs1(int u,int p)
{
ccnt[u]=x[u];
for(int v:G[u])
{
if(v!=p)
{
dfs1(v,u);
ccnt[u]+=ccnt[v];
dis[u]+=dis[v]+ccnt[v];
}
}
}
long calc[1<<17];
long dfs2(int u,int p,long par,int Ccnt)
{
long ret=calc[u]=dis[u]+par+Ccnt;
for(int v:G[u])
{
if(v!=p)
{
ret=min(ret,dfs2(v,u,calc[u]-dis[v]-ccnt[v],Ccnt+ccnt[u]-ccnt[v]));
}
}
return ret;
}
main()
{
cin>>N>>M>>Q;
UF uf(N);
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);
uf.unite(u,v);
}
for(int i=0;i<N;i++)
{
if(uf.find(i)==i)
{
dfs(i,0,-1);
}
}
for(int k=1;k<17;k++)
{
for(int i=0;i<N;i++)
{
parent[k][i]=parent[k-1][i]!=-1?parent[k-1][parent[k-1][i]]:-1;
}
}
long ans=0;
for(int i=0;i<Q;i++)
{
int a,b;cin>>a>>b;
a--,b--;
if(uf.same(a,b))
{
int ab=lca(a,b);
ans+=depth[a]+depth[b]-2*depth[ab];
}
else
{
x[a]++;
x[b]++;
}
}
for(int i=0;i<N;i++)
{
if(uf.find(i)==i)
{
dfs1(i,-1);
ans+=dfs2(i,-1,0L,0);
}
}
cout<<ans<<endl;
}