제출 #538295

#제출 시각아이디문제언어결과실행 시간메모리
538295jamezzzSplit the Attractions (IOI19_split)C++17
40 / 100
174 ms24924 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

#define sf scanf
#define pf printf
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
typedef pair<int,int> ii;

#define maxn 100005

int a,b,c,rem,col,mark[3],sub[maxn],s1,s2,cut,flag[maxn],vis[maxn];
bool backedge[maxn];
vector<int> res;
vector<int> AL[maxn];
vector<ii> x;
set<int> s,st1,st2;

void dfs(int u,int p){
	sub[u]=1;
	for(int v:AL[u]){
		if(sub[v]!=0)continue;
		dfs(v,u);
		sub[u]+=sub[v];
	}
}

void dfs2(int u,int p,int f=0){
	vis[u]=true;
	for(int v:AL[u]){
		if(v==p)continue;
		if(!f&&sub[v]>sub[u]){//back edge
			if(s1-sub[u]>=a){
				s1-=sub[u];
				s2+=sub[u];
				flag[u]=1;
				dfs2(v,u,1);
			}
			return;
		}
		if(vis[v])continue;
		dfs2(v,u,f);
	}
}

void dfs3(int u,int oflag){
	vis[u]=true;
	if(flag[u]!=-1)oflag=flag[u];
	if(oflag==0)st1.insert(u);
	else st2.insert(u);
	for(int v:AL[u]){
		if(vis[v])continue;
		dfs3(v,oflag);
	}
}

void dfs4(int u,int f){
	//pf("dfs4: %d %d %d\n",u,rem,f);
	if(rem==0)return;
	--rem;res[u]=f;
	for(int v:AL[u]){
		if(s.find(v)==s.end())continue;
		if(res[v]!=0)continue;
		dfs4(v,f);
	}
}

vector<int> find_split(int n,int _a,int _b,int _c,vector<int> p,vector<int> q){
	a=_a;b=_b;c=_c;
	x.pb({a,1});x.pb({b,2});x.pb({c,3});
	sort(all(x));
	//for(ii pr:x)pf("(%d %d) ",pr.fi,pr.se);pf("\n");
	for(int i=0;i<3;++i)mark[i]=x[i].se;
	tie(a,b,c)={x[0].fi,x[1].fi,x[2].fi};
	
	res.resize(n);
	for(int i=0;i<sz(p);++i){
		AL[p[i]].pb(q[i]);
		AL[q[i]].pb(p[i]);
	}
	dfs(0,-1);
	
	//for(int i=0;i<n;++i)pf("%d ",sub[i]);pf("\n");
	
	cut=-1;
	for(int u=1;u<n;++u){
		bool can=true;
		if(sub[u]<a)can=false;
		for(int v:AL[u]){
			if(sub[v]<sub[u]&&sub[v]>=a)can=false;
		}
		if(can){
			cut=u;break;
		}
	}
	if(cut==-1)return res;
	
	//pf("%d\n",cut);
	
	s1=sub[cut],s2=n-sub[cut];
	
	memset(flag,-1,sizeof flag);
	
	dfs2(cut,-1);
	flag[cut]=0;
	
	memset(vis,0,sizeof vis);
	dfs3(0,1);
	if(sz(st2)<a)return res;
	if(sz(st1)>b)swap(st1,st2);
	
	//for(int i:st1)pf("%d ",i);pf("\n");
	//for(int i:st2)pf("%d ",i);pf("\n");
	
	s=st1;rem=a;
	dfs4(*st1.begin(),x[0].se);
	s=st2;rem=b;
	dfs4(*st2.begin(),x[1].se);
	
	for(int i=0;i<n;++i)if(res[i]==0)res[i]=x[2].se;
	
	
	return res;
}
#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...