Submission #1367739

#TimeUsernameProblemLanguageResultExecution timeMemory
1367739DangerNoodle7591Connecting Supertrees (IOI20_supertrees)C++20
11 / 100
74 ms26128 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define N 1005



vector<int> grub[N],grub2[N];
int cev[N][N];
int two[N];
int father2[N],sze2[N];


int father[N],sze[N];
int dsu(int x){
	if(father[x]==x)return x;
	return father[x]=dsu(father[x]);
}
void kardes(int x,int y){
	x=dsu(x);y=dsu(y);
	if(x==y)return;
	if(sze[x]<sze[y])swap(x,y);
	sze[x]+=sze[y];
	father[y]=x;
}


int dsu2(int x){
	if(father2[x]==x)return x;
	return father2[x]=dsu2(father2[x]);
}
void kardes2(int x,int y){
	x=dsu2(x);y=dsu2(y);
	if(x==y)return;
	if(sze2[x]<sze2[y])swap(x,y);
	sze2[x]+=sze2[y];
	father2[y]=x;
}

void build(vector<vector<int>> _b);
int construct(vector<vector<int>> p) {
	int n = p.size();
	for(int i=0;i<=n;i++){
		father[i]=i;
		father2[i]=i;
		sze[i]=1;
		sze2[i]=1;
		two[i]=0;
		grub[i].clear();
		grub2[i].clear();
	}

	for (int i = 0; i < n; i++) {
		int iki=0,bir=0;
		for(int j=0;j<n;j++){
			cev[i][j]=0;
			if(p[i][j])kardes(i,j);
			if(p[i][j]==2)iki++;
			if(p[i][j]==1)bir++;
		}
		if(bir==1&&iki)two[i]=1;
		for(int j=0;j<n&&two[i];j++){
			if(p[i][j]==2&&two[j])kardes2(i,j);
		}
	}

	for (int i = 0; i < n; i++) {
		grub[dsu(i)].pb(i);
		if(two[i])grub2[dsu2(i)].pb(i);
	}

	
	for(int k=0;k<n;k++){
		if(grub[k].size()<=1)continue;
		vector<int> v;
		int bas=-1;
		for(auto x:grub[k]){
			if(two[x]){
				bas=dsu2(x);
				continue;
			}
			v.pb(x);
		}

		for(int i=0;i<v.size();i++){
			if(i){
				cev[v[i-1]][v[i]]=1;
				cev[v[i]][v[i-1]]=1;
			}
		}

		if(bas!=-1){
			if(v.size())grub2[bas].pb(v[0]);
			int m=grub2[bas].size();
			for(int i=0;i<m;i++){
				cev[grub2[bas][i]][grub2[bas][((i+1+m)%m)]]=1;
				cev[grub2[bas][((i+1+m)%m)]][grub2[bas][i]]=1;
				
			}
		}

	}

	vector<vector<int>> answer;
	for(int i=0;i<n;i++){
		vector<int> row;
		for(int j=0;j<n;j++){
			row.pb(cev[i][j]);
		}
		answer.pb(row);
	}

	build(answer);
	return 1;
}


#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...