Submission #311958

#TimeUsernameProblemLanguageResultExecution timeMemory
311958MrGaryConnecting Supertrees (IOI20_supertrees)C++17
100 / 100
291 ms22520 KiB
/*
{
######################
#       Author       #
#        Gary        #
#        2020        #
######################
*/
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define R(a) cin>>a
#define R2(a,b) cin>>a>>b
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
#include "supertrees.h"
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
const int MAXN=1001;
struct my_dsu{
	vector<int> vec[MAXN];
	int fa[MAXN];
	int root(int u){
		return fa[u]=(fa[u]==u? u:root(fa[u]));
	}
	void merge(int u,int v){
		u=root(u);
		v=root(v);
		if(u==v) return;
		if(vec[u].size()>vec[v].size()) swap(u,v);
		for(auto it:vec[u])
			vec[v].PB(it);
		fa[u]=v;
		vec[u].clear();
	}
}dsu,dsu2;
bool three[MAXN];
int construct(std::vector<std::vector<int>> p) {
	int n = p.size();
	rep(i,n)
		dsu.fa[i]=i,dsu.vec[i].PB(i),dsu2.fa[i]=i,dsu2.vec[i].PB(i);
	vector<vector<int> >  ans=vector<vector<int> > (n,vector<int> (n,0));
	rep(i,n)
		rep(j,n){
			if(p[i][j]==1){
				dsu.merge(i,j);
			}	
		}
	rep(i,n)
		rep(j,n)
			if(dsu.root(i)==dsu.root(j)){
				if(p[i][j]!=1) return 0;
			}
	rep(i,n)
		if(dsu.root(i)==i)
		{
			int las=-1;
			for(auto it:dsu.vec[i])
			{
				if(las!=-1){
					ans[las][it]=ans[it][las]=1;
				}
				las=it;
			}	
				 
		}
//	rep(i,n)
//		if(dsu.root(i)==i){
//			for(auto it:dsu.vec[i]) cout<<it<<' ';
//			cout<<endl;
//		}
	rep(i,n)
		rep(j,n)
			if(p[i][j]>1){
//				cout<<dsu.root(i)<<'_'<<dsu.root(j)<<endl;
				dsu2.merge(dsu.root(i),dsu.root(j));
			}
	rep(i,n)
		rep(j,n)
			if(dsu.root(i)!=dsu.root(j))
			if(dsu2.root(dsu.root(i))==dsu2.root(dsu.root(j))){
				if(p[i][j]<=1){
//					cout<<'!'<<' '<<i<<" "<<j<<endl;
					return false;
				}
			}
	rep(i,n)
		if(dsu2.root(i)==i){
			if(dsu2.vec[i].size()==1) continue;
			if(dsu2.vec[i].size()==2) return 0;
			int las=dsu2.vec[i].back();
			for(auto it:dsu2.vec[i]){
				ans[it][las]=ans[las][it]=1;
				las=it;
			}	
		}
//		cout<<"TONOW\n";
	rep(i,n)
		rep(j,n)
			if(p[i][j]==3){
				three[dsu2.root(dsu.root(i))]=1;
			}
	rep(i,n)
		if(three[i]){
			if(dsu2.vec[i].size()<=3) return 0;
			ans[dsu2.vec[i][0]][dsu2.vec[i][2]]=ans[dsu2.vec[i][2]][dsu2.vec[i][0]]=1;
		}
	rep(i,n)
		rep(j,n)
			if(dsu2.root(dsu.root(i))==dsu2.root(dsu.root(j))){
				if(three[dsu2.root(dsu.root(i))]){
					if(p[i][j]!=3) return false;
				}
			}
//	for(auto it:ans){
//		for(auto itt:it){
//			cout<<itt<<' ';
//		}
//		cout<<endl;
//	}
	build(ans);
	return 1;
}
//int main(){
//	fastio;
//	cout<<construct({{1,3},{3,1}});
//	return 0;
//}
#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...