Submission #810223

#TimeUsernameProblemLanguageResultExecution timeMemory
810223fatemetmhrSplit the Attractions (IOI19_split)C++17
40 / 100
78 ms24924 KiB
// na mn tanha nistam :)


#include <bits/stdc++.h>
#include "split.h"

using namespace std;

#define all(x) x.begin(), x.end()
#define pb     push_back
#define fi     first
#define se     second
#define mp     make_pair

typedef long long ll;

const int maxn5 = 4e5 + 10;


int a, b, c, n, sz[maxn5], ed1, ed2;
int st[3] = {1, 2, 3}, num[3];
vector <int> ret, adj[maxn5];
bool mark[maxn5];


void dfs(int v){
	mark[v] = true;
	sz[v] = 1;
	if(ed1 != -1)
		return;
	for(auto u : adj[v]) if(!mark[u] && ed1 == -1){
		dfs(u);
		sz[v] += sz[u];
		if(ed1 != -1)
			return;
		for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) if(i != j && ed1 == -1){
			if(sz[u] >= num[i] && n - sz[u] >= num[j]){
				int keep0 = i, keep1 = j;
				int keep2 = (i != 0 && j != 0 ? 0 : (i != 1 && j != 1 ? 1 : 2));
				int tmp[3] = {num[keep0], num[keep1], num[keep2]};
				num[0] = tmp[0];
				num[1] = tmp[1];
				num[2] = tmp[2];
				ed1 = u;
				ed2 = v;
				st[0] = keep0 + 1;
				st[1] = keep1 + 1;
				st[2] = keep2 + 1;
				return;
			}
		}
	}
}

void dfs_solve(int v, int ty){
	mark[v] = true;
	num[ty]--;
	ret[v] = st[ty];
	//cout << v << ' ' << ty << ' ' << num[ty] << endl;
	for(auto u : adj[v]) if(!mark[u] && num[ty])
		dfs_solve(u, ty);
}

vector<int> find_split(int N, int a, int b, int c, vector<int> p, vector<int> q) {
	n = N;
	num[0] = a;
	num[1] = b;
	num[2] = c;
	ret.resize(n);
	fill(all(ret), 0);
	for(int i = 0; i < int(p.size()); i++){
		adj[p[i]].pb(q[i]);
		adj[q[i]].pb(p[i]);
	}
	ed1 = ed2 = -1;
	dfs(0);
	if(ed1 == -1)
		return ret;
	//cout << ed1 << ' ' << ed2 << ' ' << num[0] << ' ' << num[1] << ' ' << num[2] << endl;
	memset(mark, false, sizeof mark);
	mark[ed1] = mark[ed2] = true;
	dfs_solve(ed1, 0);
	dfs_solve(ed2, 1);
	for(int i = 0; i < n; i++) if(!ret[i])
		ret[i] = st[2];
	return ret;
}
#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...