結果
問題 | No.1293 2種類の道路 |
ユーザー | Drice |
提出日時 | 2020-11-20 23:27:11 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 57 ms / 2,000 ms |
コード長 | 1,762 bytes |
コンパイル時間 | 536 ms |
コンパイル使用メモリ | 53,840 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-23 13:56:02 |
合計ジャッジ時間 | 2,328 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 2 ms
6,944 KB |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,940 KB |
testcase_09 | AC | 56 ms
6,940 KB |
testcase_10 | AC | 57 ms
6,940 KB |
testcase_11 | AC | 56 ms
6,940 KB |
testcase_12 | AC | 56 ms
6,940 KB |
testcase_13 | AC | 57 ms
6,944 KB |
testcase_14 | AC | 32 ms
6,944 KB |
testcase_15 | AC | 31 ms
6,944 KB |
testcase_16 | AC | 47 ms
6,944 KB |
testcase_17 | AC | 49 ms
6,940 KB |
testcase_18 | AC | 31 ms
6,944 KB |
testcase_19 | AC | 30 ms
6,940 KB |
testcase_20 | AC | 33 ms
6,944 KB |
testcase_21 | AC | 34 ms
6,944 KB |
testcase_22 | AC | 35 ms
6,940 KB |
testcase_23 | AC | 35 ms
6,940 KB |
ソースコード
#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 count[],int u,int v){ //equal should return ! int x = find(p,u), y = find(p,v); if(x==y) return ; count[x] += count[y]; p[y] = x; } long long cal(int n){ long long black = 0; for(int i = 1; i <= n; i++){ int u = color[1][keep[i]]; if(!vis[u]){ black += 1ll*size[1][u]; } vis[u] = 1; } for(int i = 1; i <= n; i++){ int u = color[1][keep[i]]; vis[u] = 0; } return (black-1)*1ll*n; } 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 color[0][u]<color[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; }