Submission #304147

#TimeUsernameProblemLanguageResultExecution timeMemory
304147QAQAutoMatonConnecting Supertrees (IOI20_supertrees)C++17
100 / 100
319 ms22392 KiB
#include "supertrees.h"
#include <vector>
struct dsu{
	int fa[1005];
	void init(int n){
		for(int i=0;i<n;++i)fa[i]=i;
	}
	int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
	void merge(int x,int y){fa[find(x)]=find(y);}
	int rt(int x){return fa[x]==x;}
}a,b;
int query(int x,int y){
	if(a.find(x)==a.find(y))return 1;
	if(b.find(a.find(x))==b.find(a.find(y)))return 2;
	return 0;
}
std::vector<int> al[1005],bl[1005];
int construct(std::vector<std::vector<int>> p) {
	int n = p.size();
	a.init(n);b.init(n);
	std::vector<std::vector<int>> ans(n,std::vector<int>(n));
	for(int i=0;i<n;++i)for(int j=0;j<n;++j)if(p[i][j]==3)return 0;
	for(int i=0;i<n;++i)for(int j=i+1;j<n;++j)if(p[i][j]==1){a.merge(i,j);}
	for(int i=0;i<n;++i)for(int j=i+1;j<n;++j)if(p[i][j]==2){b.merge(a.find(i),a.find(j));}
	for(int i=0;i<n;++i)for(int j=1;j<n;++j){
		if(p[i][j]!=query(i,j))return 0;
	}
	for(int i=0;i<n;++i){
		al[a.find(i)].emplace_back(i);
		if(a.rt(i)){
			bl[b.find(i)].emplace_back(i);
		}
	}
	for(int i=0;i<n;++i)if(a.rt(i)){
		int m=al[i].size();
		for(int j=0;j+1<m;++j){
			int x=al[i][j],y=al[i][j+1];
			ans[x][y]=ans[y][x]=1;
		}
	}
	for(int i=0;i<n;++i){
		if(a.rt(i) && b.rt(i)){
			if(bl[i].size()==1)continue;
			if(bl[i].size()==2)return 0;
			int m=bl[i].size();
			for(int j=0;j<m;++j){
				int x=bl[i][j],y=j==m-1?bl[i][0]:bl[i][j+1];
				ans[x][y]=ans[y][x]=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...