Submission #613890

#TimeUsernameProblemLanguageResultExecution timeMemory
613890alirezasamimi100Connecting Supertrees (IOI20_supertrees)C++17
100 / 100
221 ms23508 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; #define pb push_back const int N = 1e3 + 10; int n,P[N]; vector<int> vec[N],cy[N]; int gp(int x){ return P[x]!=-1?P[x]=gp(P[x]):x; } void uni(int v, int u){ v=gp(v); u=gp(u); if(v==u) return; P[u]=v; } int construct(vector<vector<int>> p) { memset(P,-1,sizeof P); n = p.size(); vector<vector<int>> ans(n,vector<int>(n,0)); for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ if(p[i][j]==1) uni(i,j); if(p[i][j]==3) return 0; } } for(int i=0; i<n; i++) vec[gp(i)].pb(i); memset(P,-1,sizeof P); for(int i=0; i<n; i++){ for(int j : vec[i]){ if(j!=i) ans[i][j]=ans[j][i]=1; for(int k : vec[i]) if(p[j][k]!=1) return 0; } for(int j=0; j<n; j++){ if(i==j) continue; bool f=0,g=0; for(int x : vec[i]){ for(int y : vec[j]){ if(p[x][y]==2) f=1; if(p[x][y]==0) g=1; } } if(f && g) return 0; if(f) uni(i,j); } } for(int i=0; i<n; i++) if(!vec[i].empty()){ cy[gp(i)].pb(i); } for(int i=0; i<n; i++){ for(int a : cy[i]){ for(int b : cy[i]){ if(a==b) continue; for(int x : vec[a]){ for(int y : vec[b]){ if(p[x][y]!=2) return 0; } } } } if((int)cy[i].size()==2) return 0; if((int)cy[i].size()<3) continue; int ls = i; for(int j : cy[i]){ if(j==i) continue; ans[ls][j]=ans[j][ls]=1; ls=j; } ans[ls][i]=ans[i][ls]=1; } 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...