Submission #737964

#TimeUsernameProblemLanguageResultExecution timeMemory
737964bobthebuilderSplit the Attractions (IOI19_split)C++17
100 / 100
148 ms25444 KiB
#include "split.h"
#include<bits/stdc++.h>
using namespace std;
#define sz(x) (int)x.size()
#define REP(i,n) for(int i=0;i<n;i++)
#define REP1(i,n) for(int i=1;i<=n;i++)
#define pb push_back
#define lowb(x) (x&(-x))
#define ALL(_x) _x.begin(),_x.end()
#define pii pair<int,int>
#define f first
#define s second
#define SORT_UNIQUE(x) sort(ALL(x)),x.erase(unique(ALL(x)),x.end())
#define MNTO(x,y) x=min(x,y)
const int maxn=1e5+5;
#define ll long long
vector<int> v[maxn];
bool vis[maxn];
vector<int> top;
int sz[maxn];
vector<int> val;
vector<int> cand;
vector<int> g[maxn];
int low[maxn],dep[maxn];
int cur=0;
int par[maxn];
int in[maxn],out[maxn];
void dfs(int u,int p){
	par[u]=p;
	low[u]=dep[u]=in[u]=(cur++);
	vis[u]=1;
	sz[u]=1;
	bool ok=1;
	for(int x:v[u]){
		if(x==p) continue;
		if(!vis[x]){
			dfs(x,u);
			g[u].pb(x);
			sz[u]+=sz[x];
			if(sz[x]>=val[0]){
				ok=0;
			}
			MNTO(low[u],low[x]);
		}
		else{
			MNTO(low[u],dep[x]);
		}
	}
	if(ok and sz[u]>=val[0]) cand.pb(u);
	out[u]=(cur-1);
}
bool sp[maxn];
void dfs2(int u){
	sp[u]=1;
	for(int x:g[u]){
		dfs2(x);
	}
}
//x inside a
bool ins(int x,int a){
	return (in[a]<=in[x] and out[x]<=out[a]);
}
vector<int> ans;
vector<int> asd={1,2,3};
void dfs3(int u){
	if(!val[1]) return;
	--val[1];
	ans[u]=asd[1];
	
	for(int x:v[u]){
		if(ans[x]) continue;
		if(sp[x] or !ins(x,cur)){
			dfs3(x);
		}
	}
}
void dfs4(int u){
	if(!val[0]) return;
	--val[0];
	ans[u]=asd[0];
	for(int x:g[u]){
		if(sp[x]) continue;
		dfs4(x);
	}
}
int col[maxn];
bool cmp(int a,int b){
	return val[a-1]<val[b-1];
}
vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	REP(i,n) ans.pb(0);
	REP(i,sz(p)){
		v[p[i]].pb(q[i]),v[q[i]].pb(p[i]);
	}
	val={a,b,c};
	sort(ALL(asd),cmp);
	sort(ALL(val));
	dfs(0,-1);
	for(int x:cand){
		if(!x) continue;
		cur=x;
		int tot=sz[x];
		bool swp=0;
		if(tot>=val[1]) swap(val[1],val[0]),swap(asd[0],asd[1]),swp=1;
		vector<int> oth;
		for(int z:g[x]){
			if(low[z]>=dep[x]){
				continue;
			}
			if(tot-sz[z]<val[0]) continue;
			oth.pb(z);
			tot-=sz[z];
		}
		if(n-tot<val[1]){
			if(swp) swap(val[1],val[0]),swap(asd[0],asd[1]);
			continue;
		}
		for(int z:oth){
			dfs2(z);
		}
		dfs3(par[x]);
		dfs4(x);
		REP(i,n) if(!ans[i]) ans[i]=asd[2];
		return ans;
	}
	return ans;
}
#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...