제출 #1062494

#제출 시각아이디문제언어결과실행 시간메모리
1062494new_acc슈퍼트리 잇기 (IOI20_supertrees)C++14
100 / 100
150 ms24148 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; const int N=1e4+10; int fau[N],fau2[N]; bool vis[N]; vi kt[N]; int Find(int a){ if(fau[a]==a) return a; return fau[a]=Find(fau[a]); } void Union(int a,int b){ a=Find(a),b=Find(b); fau[a]=b; } int Find2(int a){ if(fau2[a]==a) return a; return fau2[a]=Find2(fau2[a]); } void Union2(int a,int b){ a=Find2(a),b=Find2(b); fau2[a]=fau2[b]; } int construct(vector<vi> g) { int n=g.size(); iota(fau,fau+1+n,0); iota(fau2,fau2+1+n,0); vector<vi> ans=g; for(int i=0;i<n;i++){ for(int i2=0;i2<n;i2++) ans[i][i2]=0; } for(int i=0;i<n;i++){ for(int i2=0;i2<n;i2++){ if(g[i][i2]==1) Union(i+1,i2+1); } } for(int i=0;i<n;i++){ for(int i2=0;i2<n;i2++){ if(g[i][i2]==2) Union2(Find(i+1),Find(i2+1)); } } for(int i=1;i<=n;i++){ int u=Find(i); if(vis[u]) continue; vis[u]=1; kt[Find2(u)].push_back(u); } for(int i=1;i<=n;i++){ if(kt[i].size()==2){ return 0; } if(kt[i].size()<2) continue; for(int i2=0;i2<(int)kt[i].size();i2++){ int nxt=kt[i][(i2+1)%kt[i].size()],u=kt[i][i2]; ans[u-1][nxt-1]=1,ans[nxt-1][u-1]=1; } } for(int i=1;i<=n;i++){ int u=Find(i); if(u!=i) ans[u-1][i-1]=1,ans[i-1][u-1]=1; } for(int i=0;i<n;i++){ for(int i2=0;i2<n;i2++){ int u=Find(i+1),u2=Find(i2+1); int v1=Find2(u),v2=Find2(u2); if(g[i][i2]==0){ if(u==u2 or v1==v2) return 0; } if(g[i][i2]==1){ if(u!=u2) return 0; } if(g[i][i2]==2){ if(u==u2 or v1!=v2) return 0; } if(g[i][i2]==3) return 0; } } build(ans); return 1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...