Submission #1327742

#TimeUsernameProblemLanguageResultExecution timeMemory
1327742nicolo_010Split the Attractions (IOI19_split)C++20
0 / 100
0 ms332 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;

vector<vector<int>> adj;
vector<bool> vis, vis2;
vector<ll> sz;
int smn, mn;
int n;
vector<int> res;
int cnt;
vector<pii> cols;

void dfs1(int u, int i) {
	int col = cols[i].second;
	res[u] = col;
	cnt++;
	vis2[u] = true;
	int val = cols[i].first;
	if (cnt==val) return;
	for (auto v : adj[u]) {
		if (vis2[v]) continue;
		dfs1(v, i);
	}
}

int dfs(int u, int p=-1) {
	sz[u] = 1;
	vis[u] = true;
	for (auto v : adj[u]) {
		if (vis[v] || v==p) continue;
		sz[u] += dfs(v, u);
	}
	if (sz[u] >= mn && n-sz[u] >= smn) {
		vis2.assign(n, false);
		vis2[u] = true;
		cnt=0;
		dfs1(p, 1);
		cnt=0;
		dfs1(u, 0);
		return -1e9;
	}
	if (sz[u] >= smn && n-sz[u] >= mn) {
		vis2.assign(n, false);
		vis2[u] = true;
		cnt=0;
		dfs1(p, 0);
		cnt=0;
		dfs1(u, 1);
		return -1e9;
	}
	return sz[u];
}


vector<int> find_split(int N, int a, int b, int c, vector<int> p, vector<int> q) {
	n = N;
	cols.clear();
	cols.push_back({a, 1});
	cols.push_back({b, 2});
	cols.push_back({c, 3});
	sort(cols.begin(), cols.end());
	adj.assign(n, {});
	int m = p.size();
	mn = min({a, b, c});
	smn = a+b+c - max({a, b, c}) - mn;
	for (int i=0; i<m; i++) {
		int u = p[i];
		int v = q[i];
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	res.assign(n, 0);
	vis.assign(n, false);
	sz.assign(n, 0);
	dfs(0);
	if (sz[0] == n) {
		res.assign(n, 0);
		return res;
	}
	else {
		for (int i=0; i<n; i++) {
			int val = cols[2].second;
			if (res[i] == 0) res[i] = val;
		}
		return res;
	}
}
#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...