Submission #1368274

#TimeUsernameProblemLanguageResultExecution timeMemory
1368274DangerNoodle7591Connecting Supertrees (IOI20_supertrees)C++20
46 / 100
74 ms26124 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define N 1005
#define ins insert


vector<int> grub[N];
int cev[N][N];
int dolu[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;
	cev[x][y]=1;
	cev[y][x]=1;
	//adj[x].pb(y);
	//adj[y].pb(x);
	if(sze[x]<sze[y])swap(x,y);
	sze[x]+=sze[y];
	father[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++){
		for(int j=0;j<=n;j++)cev[i][j]=0;
		dolu[i]=0;
		grub[i].clear();
		father[i]=i;
		sze[i]=1;
	}
	//clearlari yap

	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(p[i][j]==1)kardes(i,j);
		}
	}
	for(int i=0;i<n;i++){
		grub[dsu(i)].pb(i);
	}

	for(int k=0;k<n;k++){
		if(dsu(k)!=k)continue;
		if(dolu[k])continue;
		for(auto u:grub[k]){
			dolu[u]=1;
			/*for(auto uu:grub[k]){
				if(p[u][uu]!=1)return 0;
			}*/
		}
		set<int> iki;

		
		for(int j=0;j<n;j++){
			if(p[k][j]==2)iki.ins(dsu(j));
		}
		if(iki.size()==0)continue;
		//if(iki.size()==1)return 0;



		/*for(auto u:grub[k])cout<<u<<"=";
		cout<<endl;
		for(auto u:iki)cout<<u<<" ";
		cout<<endl;*/
		for(auto u:grub[k]){
			for(auto uu:iki){
				if(u==uu)continue;
				//if(p[u][uu]!=2)return 0;

			}
		}


		set<int> norm;

		for(auto u:grub[k])norm.ins(u);

		for(auto u:iki){
			dolu[u]=1;
			//cout<<u<<" ";
			for(int i=0;i<n;i++){
				if(i==u)continue;
				//cout<<i<<" "<<u<<" "<<p[u][i]<<endl;
				/*if(iki.find(i)!=iki.end()||norm.find(i)!=norm.end()){
					if(p[u][i]!=2)return 0; 
				}
				else if(p[u][i]!=0)return 0;*/
			}
		}
		iki.ins(k);	
		vector<int> v;
		for(auto u:iki)v.pb(u);
		int m=v.size();
		for(int i=0;i<m;i++){
			cev[v[i]][v[(i+1+m)%m]]=1;
			cev[v[(i+1+m)%m]][v[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]);
		}
		//cout<<endl;
		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...