結果
| 問題 |
No.1293 2種類の道路
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-11-20 23:13:03 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,107 bytes |
| コンパイル時間 | 842 ms |
| コンパイル使用メモリ | 58,692 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-23 13:47:05 |
| 合計ジャッジ時間 | 2,626 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 6 WA * 16 |
ソースコード
#include<cstdio>
#include<vector>
#include<algorithm>
int p[2][100005];
int size[2][100005];
int e[100005];
int color[2][100005];
int keep[100005];
int vis[100005];
int find(int p[],int u){
if(p[u]==u) return u;
else return p[u] = find(p,p[u]);
}
void merge(int p[],int size[],int u,int v){
size[find(p,u)] += size[find(p,v)];
p[find(p,v)] = find(p,u);
}
long long cal(int n){
long long black = 0;
for(int i = 1; i <= n; i++){
int u = color[1][keep[i]];
//printf("u = %d: %d\n",u,size[1][u]);
if(!vis[u]){
//printf("u = %d, size[1][u] = %d\n",u,size[1][u]);
black += 1ll*size[1][u];
}
vis[u] = 1;
}
std::sort(keep+1,keep+1+n,[&](int& u,int& v){
return color[1][u]<color[1][v];
});
//printf("black = %d\n",black);
long long res = 0;
for(int i = 1; i <= n; i++){
long long add = black-1;
//printf("i = %d, add = %lld\n",keep[i],add);
res += add;
}
for(int i = 1; i <= n; i++){
int u = color[1][keep[i]];
vis[u] = 0;
}
return res;
}
int main(){
int n,a,b;
scanf("%d%d%d",&n,&a,&b);
for(int i = 1; i <= n; i++){
p[0][i] = p[1][i] = i;
size[0][i] = size[1][i] = 1;
e[i] = i;
}
for(int i = 1; i <= a; i++){
int u,v;
scanf("%d%d",&u,&v);
merge(p[0],size[0],u,v);
}
for(int i = 1; i <= b; i++){
int u,v;
scanf("%d%d",&u,&v);
merge(p[1],size[1],u,v);
}
for(int i = 1; i <= n; i++){
color[0][i] = find(p[0],i);
color[1][i] = find(p[1],i);
//printf("i = %d: %d %d\n",i,color[0][i],color[1][i]);
}
std::sort(e+1,e+1+n,[&](int& u,int& v){
return find(p[0],u)<find(p[0],v);
});
int p = 1;
long long ans = 0;
while(p<=n){
int np = p;
while(np+1<=n && color[0][e[np+1]]==color[0][e[p]]) np++;
int cnt = 0;
for(int i = p; i <= np; i++) keep[++cnt] = e[i];
ans += cal(cnt);
p = np+1;
}
printf("%lld\n",ans);
return 0;
}