Submission #1342006

#TimeUsernameProblemLanguageResultExecution timeMemory
1342006Jawad_Akbar_JJSplit the Attractions (IOI19_split)C++17
100 / 100
133 ms32956 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 1<<17;
vector<int> nei[N], adj[N], Ans;
vector<pair<int, int>> vec;
int hei[N], ch[N], seen[N], A, B, C, cA = 1, cB = 2, cC = 3;
pair<int, pair<int, int>> Mn[N];

void dfs1(int u, int p, int h, int mx = 0){
	hei[u] = h;
	ch[u] = 1;
	Mn[u] = {h, {u, u}};

	for (int i : nei[u]){
		if (i == p)
			continue;
		if (hei[i]){
			Mn[u] = min(Mn[u], {hei[i], {u, i}});
			continue;
		}

		adj[u].push_back(i);
		adj[i].push_back(u);

		dfs1(i, u, h+1);
		Mn[u] = min(Mn[u], Mn[i]);

		ch[u] += ch[i];
		mx = max(mx, ch[i]);
	}

	if (mx < A and ch[u] >= A)
		vec.push_back({u, p});
}

int dfs2(int u, int p, int lim, int col){
	if (lim == 0)
		return 0;
	seen[u] = 1, lim --;
	Ans[u] = col;

	for (int i : adj[u]){
		if (!seen[i])
			lim = dfs2(i, u, lim, col);
	}
	return lim;
}

vector<int> find_split(int n, int a, int b, int c, vector<int> u, vector<int> v){
	A = a, B = b, C = c, cA = 1, cB = 2, cC = 3;
	if (A > B)
		swap(A, B), swap(cA, cB);
	if (A > C)
		swap(A, C), swap(cA, cC);
	if (B > C)
		swap(B, C), swap(cB, cC);

	for (int i=0;i<u.size();i++){
		nei[u[i]].push_back(v[i]);
		nei[v[i]].push_back(u[i]);
	}

	dfs1(0, 0, 1);

	Ans.resize(n, cC);
	for (auto [u, p] : vec){
		vector<pair<int, int>> v;
		int s = ch[0] - ch[u];

		for (int i : nei[u]){
			if (s < A and hei[i] == hei[u] + 1 and Mn[i].first < hei[u])
				s += ch[i], v.push_back(Mn[i].second);
		}
		if (s < A)
			continue;
		
		for (auto [i, j] : v){
			adj[i].push_back(j);
			adj[j].push_back(i);
		}

		if (ch[0] - s >= B){
			seen[u] = 1;
			dfs2(p, p, A, cA);
			seen[u] = 0;
			dfs2(u, u, B, cB);
		}
		else{
			seen[u] = 1;
			dfs2(p, p, B, cB);
			seen[u] = 0;
			dfs2(u, u, A, cA);
		}
		return Ans;
	}
	return vector<int> (n, 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...