Submission #1136597

#TimeUsernameProblemLanguageResultExecution timeMemory
1136597bestbestConnecting Supertrees (IOI20_supertrees)C++20
56 / 100
145 ms26136 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; #define en '\n' #define sp ' ' const int N=1000; int par[N],chk[N][N],vis[N],branch[N]; map<int,vector<int>> m,l; int find(int a){ if(a!=par[a])return par[a]=find(par[a]); return par[a]; } int construct(vector<vector<int>> p) { int n = p.size(); vector<vector<int>> answer; for (int i = 0; i < n; i++) { vector<int> row; row.resize(n); answer.push_back(row); } for(int i=0;i<N;i++)par[i]=i; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(p[i][j]==3)return 0; else if(!p[i][j] && par[find(i)]==par[find(j)])return 0; else if(p[i][j] && chk[i][j]==-1 || !p[i][j] && chk[i][j]==1)return 0; else if(p[i][j] && (chk[i][j]==0 || chk[i][j]==1)){ chk[i][j]=1; par[find(i)]=par[find(j)]; } else if(!p[i][j] && (chk[i][j]==0 || chk[i][j]==-1)){ chk[i][j]=-1; } else return 0; } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(par[find(i)]==par[find(j)] && !p[i][j])return 0; else if(par[find(i)]!=par[find(j)] && p[i][j])return 0; } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++)chk[i][j]=0; } for(int i=0;i<n;i++){ m[par[i]].push_back(i); } for(int i=0;i<n;i++)par[i]=i; vector<int> v; set<vector<int>> s; for(auto [k,u]:m){ for(int i=0;i<u.size();i++){ for(int j=0;j<u.size();j++){ if(p[u[i]][u[j]]==2 && par[find(u[i])]==par[find(u[j])])return 0; else if(p[u[i]][u[j]]==1 && chk[u[i]][u[j]]==-1 || p[u[i]][u[j]]==2 && chk[u[i]][u[j]]==1)return 0; else if(p[u[i]][u[j]]==1 && (chk[u[i]][u[j]]==0 || chk[u[i]][u[j]]==1)){ chk[u[i]][u[j]]=1; par[find(u[i])]=par[find(u[j])]; } else if(p[u[i]][u[j]]==2 && (chk[u[i]][u[j]]==0 || chk[u[i]][u[j]]==-1)){ chk[u[i]][u[j]]=-1; } else return 0; } } for(int i=0;i<u.size();i++){ for(int j=0;j<u.size();j++){ if(p[u[i]][u[j]]==1 && par[find(u[i])]!=par[find(u[j])])return 0; else if(p[u[i]][u[j]]==2 && par[find(u[i])]==par[find(u[j])])return 0; } } l.clear(); for(int i=0;i<u.size();i++){ l[par[u[i]]].push_back(u[i]); } vector<int> c; for(auto [j,v]:l){ c.push_back(j); for(auto i:v){ if(i!=j)answer[j][i]=answer[i][j]=1; } } for(int i=0;i<c.size();i++){ if(i!=(i+1)%c.size())answer[c[i]][c[(i+1)%c.size()]]=answer[c[(i+1)%c.size()]][c[i]]=1; } } build(answer); 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...