結果

問題 No.1293 2種類の道路
ユーザー DriceDrice
提出日時 2020-11-20 23:17:05
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,703 bytes
コンパイル時間 528 ms
コンパイル使用メモリ 53,968 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-07-23 13:51:03
合計ジャッジ時間 2,209 ms
ジャッジサーバーID
(参考情報)
judge5 / 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,940 KB
testcase_04 WA -
testcase_05 AC 2 ms
6,940 KB
testcase_06 AC 2 ms
6,940 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 31 ms
6,944 KB
testcase_15 AC 31 ms
6,940 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 -
権限があれば一括ダウンロードができます

ソースコード

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 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]];
        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