結果
問題 | No.1293 2種類の道路 |
ユーザー | Drice |
提出日時 | 2020-11-20 23:13:03 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | WA | - |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | AC | 41 ms
6,944 KB |
testcase_15 | AC | 41 ms
6,944 KB |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
ソースコード
#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; }