結果

問題 No.3756 Udon Network
ユーザー tsunamayo123
提出日時 2026-09-10 22:59:27
言語 C++23
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 2,202 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 4,128 ms
コンパイル使用メモリ 383,920 KB
実行使用メモリ 24,704 KB
最終ジャッジ日時 2026-10-09 17:30:56
合計ジャッジ時間 20,304 ms
ジャッジサーバーID
(参考情報)
judge4_0 / judge5_0
このコードへのチャレンジ
(要ログイン)
サブタスク 配点 結果
Example 0 % AC * 1 WA * 7
Subtask $1$ 2 % AC * 2 WA * 13
Subtask $2$ 4 % AC * 2 WA * 20
Subtask $3$ 8 % AC * 2 WA * 7
Subtask $4$ 16 % AC * 10
Subtask $5$ 32 % AC * 2 WA * 8
Subtask $6$ 38 % AC * 10 WA * 43
合計 4 * 16% = 64 点
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

// 部分点4
// クラスカル+UnionFind (小さいサイズの要素を大きいサイズの方に移すやつ)

#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;

int main(){
    int N,M,Q;
    cin>>N>>M>>Q;

    vector<int> A(N);
    for(int i=0; i<N; i++){
        cin>>A[i];
        A[i]--;
    }

    vector<pair<int,int>> B;

    vector<int> U(M),V(M),W(M);
    for(int j=0; j<M; j++){
        cin>>U[j]>>V[j]>>W[j];
        U[j]--,V[j]--;

        B.push_back({W[j],j});
    }
    sort(B.begin(),B.end());

    vector<int> S(Q),C(Q);
    for(int k=0; k<Q; k++){
        cin>>S[k]>>C[k];
        S[k]--;
    }

    vector<int> ans(N,1e9+1);
    dsu UF(N);
    
    vector color=A;
    vector<vector<int>> pending(N);
    for(int i=0;i<N;i++)pending[i].push_back(i);

    auto check = [&](int u,int w){
        for(int v:pending[UF.leader(u)]){
            ans[v]=w;
        }
        pending[UF.leader(u)].clear();
    };

    for(int j=0; j<M; j++){
        auto [s,k] = B[j];

        if(!UF.same(U[k],V[k])){
            int a=UF.leader(U[k]);
            int b=UF.leader(V[k]);

            if((color[a]!=-1) && (color[b]==-1)){
                color[a]=-1;
                check(a,s);
            }else if((color[a]==-1) && (color[b]!=-1)){
                color[b]=-1;
                check(b,s);
            }else if((color[a]!=-1) && (color[b]!=-1)){
                if(color[a]!=color[b]){
                    color[a]=-1;
                    color[b]=-1;
                    check(a,s);
                    check(b,s);
                }
            }
            int n=UF.merge(a,b);

            if(n!=a){
                for(auto p:pending[a]){
                    pending[n].push_back(p);
                }
                pending[a].clear();
            }
            if(n!=b){
                for(auto p:pending[b]){
                    pending[n].push_back(p);
                }
                pending[b].clear();
            }
        }
    }

    for(int k=0; k<Q; k++){
        if(C[k]==1)cout<<0<<endl;
        if(C[k]==2){
            if(ans[S[k]]==1e9+1)cout<<-1<<endl;
            else cout<<ans[S[k]]<<endl;
        }
    }
}
0