제출 #1241582

#제출 시각아이디문제언어결과실행 시간메모리
1241582moondarkside슈퍼트리 잇기 (IOI20_supertrees)C++20
96 / 100
330 ms26148 KiB
#include<bits/stdc++.h> using namespace std; void build(vector<vector<int>> b); vector<vector<int>> Req; vector<int> UF; vector<vector<int>> Build; int getTop(int a){ auto b=UF; auto x=a; if(UF[a]==a){ return a; } UF[a]=getTop(UF[a]); return UF[a]; } void join(int a,int b){ UF[getTop(b)]=getTop(a); } void connect(int i,int j){ Build[i][j]=1; Build[j][i]=1; } int buildOneTree(vector<int> Tree){ for(int i=0;i<Tree.size();i++){ for(int j=i+1;j<Tree.size();j++){ if(Req[Tree[i]][Tree[j]]>1){ return 0; } } } for(int i=1;i<Tree.size();i++){ connect(Tree[i],Tree[0]); } return 1; } int BuildTree(vector<int> Tree){ int n=Tree.size(); UF=vector<int>(n); for(int i=0;i<n;i++){ UF[i]=i; } int delta=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(Req[Tree[i]][Tree[j]]==0){ return 0; } if(Req[Tree[i]][Tree[j]]==1){ join(i,j); } if(Req[Tree[i]][Tree[j]]>1 && delta==0){ delta=Req[Tree[i]][Tree[j]]; } if(Req[Tree[i]][Tree[j]]>1 && Req[Tree[i]][Tree[j]]!=delta){ return 0; } } } vector<vector<int>> SubTrees; for(int i=0;i<n;i++){ if(UF[i]!=-1){ vector<int> NewTree; int eq=UF[i]; for(int j=i;j<n;j++){ if(UF[j]==eq){ NewTree.push_back(Tree[j]); UF[j]=-1; } } SubTrees.push_back(NewTree); } } if(delta<3){ if(SubTrees.size()==2){ return 0; } if(SubTrees.size()==1){ return buildOneTree(SubTrees[0]); } for(int i=0;i<SubTrees.size();i++){ if(buildOneTree(SubTrees[i])==0){ return 0; } connect(SubTrees[i][0],SubTrees[(i+1)%SubTrees.size()][0]); } return 1; } if(SubTrees.size()<3){ return 0; } connect(SubTrees[0][0],SubTrees[SubTrees.size()-1][0]); connect(SubTrees[1][0],SubTrees[SubTrees.size()-1][0]); if(buildOneTree(SubTrees[SubTrees.size()-1])==0){ return 0; } for(int i=0;i<SubTrees.size()-1;i++){ if(buildOneTree(SubTrees[i])==0){ return 0; } connect(SubTrees[i][0],SubTrees[(i+1)%(SubTrees.size()-1)][0]); } return 1; }; int construct(vector<vector<int>> p){ Req=p; int n=p.size(); Build=vector<vector<int>>(n,vector<int>(n)); UF=vector<int>(n); for(int i=0;i<n;i++){ UF[i]=i; } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(p[i][j]>0){ join(i,j); } } } vector<vector<int>> SubTrees; for(int i=0;i<n;i++){ if(UF[i]!=-1){ vector<int> Tree; int eq=UF[i]; for(int j=i;j<n;j++){ if(UF[j]==eq){ Tree.push_back(j); UF[j]=-1; } } SubTrees.push_back(Tree); } } for(int i=0;i<SubTrees.size();i++){ if(BuildTree(SubTrees[i])==0){ return 0; } } build(Build); 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...