Submission #1047510

#TimeUsernameProblemLanguageResultExecution timeMemory
1047510Onur_IlgazSplit the Attractions (IOI19_split)C++17
0 / 100
435 ms1048576 KiB
#include "split.h"
#include <bits/stdc++.h>
#define int long long
#define inf ((int)1e18)
const int N = 100000;
using namespace std;

vector<int32_t> find_split(int32_t n, int32_t a, int32_t b, int32_t c, vector<int32_t> p, vector<int32_t> q) {
	vector <int32_t> sub(n), ans(n);
	vector <vector<int> > adj(n);
	int m = p.size();
	vector <pair<int, int> > fuck = {{a, 1}, {b, 2}, {c, 3}};

	for(int i = 0; i < m; i++) {
		int a = p[i], b = q[i];
		adj[a].push_back(b);
		adj[b].push_back(a);
	}

	int size = 0;
	auto taguntil = [&](int node, int ata, int tag, auto&& dfs) -> void {
		size--;
		ans[node] = tag;
		for(auto it:adj[node]) {
			if(it == ata) continue;
			if(size) dfs(it, node, tag, dfs);
		}
	};

	auto dfs = [&](int node, int ata, auto&& dfs) -> bool {
		// cout << node << " " << ata << endl;
		sub[node] = 1;
		for(auto it:adj[node]) {
			if(it == ata) continue;
			if(dfs(it, node, dfs)) {
				return true;
			}
			sub[node] += sub[it];
		}		
		if(sub[node] == fuck[0].first) {
			size = fuck[0].first;
			taguntil(node, ata, fuck[0].second, taguntil);
			size = fuck[1].first;
			taguntil(ata, node, fuck[1].second, taguntil);
			for(auto &it:ans) if(it == 0) it = fuck[2].second;
			return true;
		}
		if(n - sub[node] == fuck[0].first) {
			size = fuck[0].first;
			taguntil(ata, node, fuck[0].second, taguntil);
			size = fuck[1].first;
			taguntil(node, ata, fuck[1].second, taguntil);
			for(auto &it:ans) if(it == 0) it = fuck[2].second;
			return true;
		}
		return false;
	};

	if(dfs(0, 0, dfs)) return ans;
	swap(fuck[0], fuck[1]);
	if(dfs(0, 0, dfs)) return ans;
	swap(fuck[0], fuck[2]);
	if(dfs(0, 0, dfs)) return ans;
	return ans;
}
#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...