Submission #891450

#TimeUsernameProblemLanguageResultExecution timeMemory
891450Jawad_Akbar_JJSplit the Attractions (IOI19_split)C++17
18 / 100
73 ms32208 KiB
#include <iostream>
#include <vector>
#include <cstdio>
#include <cassert>
#include <algorithm>
#include "split.h"

using namespace std;

const int N = (1<<18) + 1;
vector<int> nei[N],ch[N];
int color[N],A,B;
vector<vector<int>> v;
int sz[N],blocked = -1;
bool seen[N],found = false;



void color_it(int u,int c){
	color[u] = c;
	A--;
	if (A == 0)
		return;
	for (int i : ch[u]){
		if (blocked == i)
			continue;
		color_it(i,c);
		if (A==0)
			return;
	}
}



void dfs(int u){
	seen[u] = true;
	sz[u] = 1;
	for (int i : nei[u]){
		if (seen[i])
			continue;
		ch[u].push_back(i);
		dfs(i);
		sz[u] += sz[i];
	}
}

void dfs2(int u){
	for (int i : ch[u]){
		if (found)
			return;
		if (sz[i]>=A and (sz[1] - sz[i]) >= B){
			color_it(i,v[0][1]);
			A = B;
			blocked = i;
			color_it(1,v[1][1]);
			found = true;
			return;
		}
		dfs2(i);
	}
}


vector<int> find_split(int n,int a,int b,int c,vector<int> p,vector<int> q){
	int m = p.size();

	for (int i=0;i<m;i++){
		p[i]++;
		q[i]++;
		nei[p[i]].push_back(q[i]);
		nei[q[i]].push_back(p[i]);
	}

	dfs(1);

	v = {{a,1},{b,2},{c,3}};
	sort(begin(v),end(v));
	A = v[0][0];
	B = v[1][0];
	dfs2(1);

	vector<int> ans;

	for (int i=1;i<=n;i++){
		if (found and color[i]==0)
			ans.push_back(v[2][1]);
		else
			ans.push_back(color[i]);
	}
	return ans;

}

// int main() {
// 	int n, m, a, b, c;
// 	assert(5 == scanf("%d%d%d%d%d", &n, &m, &a, &b, &c));
// 	vector<int> p(m), q(m);
// 	for (int i=0; i<m; i++)
// 		assert(2 == scanf("%d%d", &p[i], &q[i]));
// 	fclose(stdin);

// 	vector<int> result = find_split(n, a, b, c, p, q);

// 	for (int i=0; i<(int)result.size(); i++)
// 		printf("%s%d", ((i>0)?" ":""), result[i]);
// 	printf("\n");
// 	fclose(stdout);
// 	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...