結果

問題 No.1293 2種類の道路
ユーザー DriceDrice
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0