Submission #1210509

#TimeUsernameProblemLanguageResultExecution timeMemory
1210509banganSplit the Attractions (IOI19_split)C++20
0 / 100
570 ms1114112 KiB
#include "split.h"
using namespace std;

#define X first 
#define Y second
#define pair pair<int, int>

#define pb push_back
#define all(a) a.begin(), a.end()

const int N = 2e5 + 4;

vector<int> adj[N];
int sub[N];
int fa[N];
bool dead[N];
vector<int> ans;
vector<pair> ord;

void prep(int v) {	
	for (int u : adj[v]) if (u != fa[v]) {
		fa[u] = v;
		prep(u);
		sub[v] += sub[u];
	}
}

void kill(int v, int id) {
	dead[v]=1;
	ans[v] = id;
	for (int u : adj[v]) if (u != fa[v]) kill(u, id);
}

void assign(int v, int cnt, int id) {
	if (cnt>0) ans[v] = id, cnt--;
	for (int u : adj[v]) if (u != fa[v] && !dead[u]) assign(u, cnt, id);
}

bool work(int n) {
	ans.resize(n);
	fill(all(ans), 0);
	fill(dead, dead+n, false);
	int v=0;
	for (int i=0; i<n; i++) if (sub[i]>=ord.back().X && sub[i]<sub[v]) v=i;
	kill(v, ord.back().Y);
	ord.pop_back();
	if (!dead[0]) assign(0, ord.back().X, ord.back().Y);
	if (count(all(ans), ord.back().Y) != ord.back().X) return 0;
	ord.pop_back();
	for (int i=0; i<n; i++) if (!ans[i]) ans[i] = ord.back().Y;
	return 1;
}

vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
	for (int i=0; i<p.size(); i++) {
		adj[p[i]].pb(q[i]);
		adj[q[i]].pb(p[i]);
	}
	prep(0);
	ord = {{a,1}, {b,2}, {c,3}};
	sort(all(ord), [&](auto lhs, auto rhs) {
		return lhs.X > rhs.X;
	});
	if (work(n)) return ans;
	ord = {{a,1}, {b,2}, {c,3}};
	sort(all(ord), [&](auto lhs, auto rhs) {
		return lhs.X > rhs.X;
	});
	swap(ord[1], ord[2]);
	if (work(n)) 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...