Submission #1369576

#TimeUsernameProblemLanguageResultExecution timeMemory
1369576viduxSplit the Attractions (IOI19_split)C++17
18 / 100
74 ms26536 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	vector<vector<int>> g(n), adj(n);
	for (int i = 0; i < (int)p.size(); i++) {
		g[p[i]].push_back(q[i]);
		g[q[i]].push_back(p[i]);
	}
	vector<int> seen(n);
	auto dfs1 = [&](auto dfs, int u = 0) -> void {
		if (seen[u]) return;
		seen[u] = 1;
		for (int v : g[u]) if (!seen[v]) {
			adj[u].push_back(v);
			adj[v].push_back(u);
			dfs(dfs, v);
		}
	};
	dfs1(dfs1);
	vector<array<int, 2>> color = {{a, 1}, {b, 2}, {c, 3}};
	sort(color.begin(), color.end());
	vector<vector<pair<int, int>>> sub(n);
	vector<int> mxsub(n);
	auto dfs2 = [&](auto dfs, int u = 0, int p = -1) -> int {
		int tot = 1;
		for (int v : adj[u]) if (v != p) {
			int sz = dfs(dfs, v, u);
			sub[u].push_back(pair<int, int>{sz, v});
			mxsub[u] = max(mxsub[u], sz);
			tot += sz;
		}
		if (tot != n) sub[u].push_back(pair<int, int>{n-tot, p});
		return tot;
	};
	dfs2(dfs2);
	vector<int> ans(n, color[2][1]);
	auto dfs3 = [&](auto dfs, int &need, int col, int u, int p) -> void {
		if (!need) return;
		ans[u] = col;
		need--;
		for (int v : adj[u]) if (v != p) dfs(dfs, need, col, v, u);
	};
	for (int i = 0; i < n; i++) for (auto [sz1, j] : sub[i]) {
		int sz2 = n-sz1;
		if (color[0][0] <= sz1 && color[1][0] <= sz2) {
			dfs3(dfs3, color[0][0], color[0][1], j, i);
			dfs3(dfs3, color[1][0], color[1][1], i, j);
			return ans;
		}
		if (color[1][0] <= sz1 && color[0][0] <= sz2) {
			dfs3(dfs3, color[0][0], color[0][1], i, j);
			dfs3(dfs3, color[1][0], color[1][1], j, i);
			return ans;
		}
	}
	int rem = 0;
	for (int i = 0; i < n; i++) if (mxsub[i] < color[0][0]) { rem = i; break; }
	seen = vector<int>(n);
	vector<int> s;
	auto dfs4 = [&](auto dfs, int u) -> void {
		if (seen[u] || u == rem) return;
		seen[u] = 1;
		s.push_back(u);
		for (int v : g[u]) dfs(dfs, v);
	};
	bool ok = 0;
	for (int i = 0; i < n; i++) {
		s.clear();
		dfs4(dfs4, i);
		if ((int)s.size() >= color[0][0]) {
			for (int u : s) if (color[0][0]) ans[u] = color[0][1], color[0][0]--;
			ok = 1;
			break;
		}
	}
	if (!ok) return vector<int>(n);
	auto dfs5 = [&](auto dfs, int u) -> void {
		if (ans[u] != color[2][1]) return;
		if (!color[1][0]) return;
		color[1][0]--;
		ans[u] = color[1][1];
		for (int v : g[u]) dfs(dfs, v);
	};
	dfs5(dfs5, rem);
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...