Submission #1291721

#TimeUsernameProblemLanguageResultExecution timeMemory
1291721enzyConnecting Supertrees (IOI20_supertrees)C++20
96 / 100
108 ms27456 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn=1010;
int pai[maxn];
vector<int>cmp[maxn], vontade[maxn];
int find(int a){
	if(a==pai[a]) return a;
	return pai[a]=find(pai[a]);
}
void merge(int a, int b){
	a=find(a); b=find(b);
	if(a==b) return;
	if(cmp[a]<cmp[b]) swap(a,b);
	for(int x : cmp[b]) cmp[a].push_back(x);
	for(int x : vontade[b]) vontade[a].push_back(x);
	pai[b]=a;
	cmp[b].clear();
	vontade[b].clear();
}
int construct(vector<vector<int>> p){
	int n=p.size();
	for(int i=0;i<n;i++){
		pai[i]=i;
		cmp[i].push_back(i);
	}
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++) if(p[i][j]==1) merge(i,j);
	//cout << "obvio" << endl;
	// juntei tds os caras q formarão as árvoes
	vector<vector<int>>ans(n,vector<int>(n,0));
	for(int i=0;i<n;i++){
		int last=-1;
		for(int x : cmp[i]){
			if(last!=-1) ans[x][last]=ans[last][x]=1;
			for(int y : cmp[i]) if(x!=y&&p[x][y]!=1) return 0;
			last=x;
		}
		for(int x : cmp[i]) vontade[i].push_back(x);
		cmp[i].clear();
		cmp[i].push_back(i);
	}
	//cout << "eh" << endl;
	// chequei se não tinha incongruencias
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++){
			if(p[i][j]==2){
				int a=find(i), b=find(j);
				if(a==b) continue;
				for(int x : vontade[a])
					for(int y : vontade[b]) if(x!=y&&p[x][y]!=2) return 0;
				merge(a,b);
			}
		}
	//cout << "wow" << endl;
	for(int i=0;i<n;i++){
		if(cmp[i].size()==2) return 0;
		if(cmp[i].size()<=2) continue;
		int first=cmp[i][0], last=-1;
		for(int x : cmp[i]){
			if(last!=-1) ans[x][last]=ans[last][x]=1;
			last=x;
		}
		ans[last][first]=ans[first][last]=1;
	}
	//cout << "ah n" << endl;
	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...