結果
| 問題 | No.3756 Udon Network |
| ユーザー |
tsunamayo123
|
| 提出日時 | 2026-09-10 22:59:27 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 2,202 bytes |
| 記録 | |
| コンパイル時間 | 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 点 |
ソースコード
// 部分点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;
}
}
}
tsunamayo123