제출 #1290732

#제출 시각아이디문제언어결과실행 시간메모리
1290732julia_08Split the Attractions (IOI19_split)C++20
0 / 100
124 ms250484 KiB
#include <bits/stdc++.h>
#include "split.h"

using namespace std;

const int MAXN = 2e5 + 10;

vector<pair<int, int>> split;

set<int> marc[MAXN];

int pre[MAXN], pos[MAXN], id[MAXN], sub[MAXN], pai[MAXN];

vector<int> adj[MAXN];

vector<int> ans;

pair<int, int> possible;

int n, t = 0;

void dfs_1(int v, int p){

	sub[v] = 1;

	pre[v] = ++t;
	id[pre[v]] = v;

	for(auto u : adj[v]){
		if(u != p){
			pai[u] = v;
			dfs_1(u, v);
			sub[v] += sub[u];
		}
	}

	pos[v] = t;

}

void dfs_2(int v, int p){

	if(sub[v] == split[0].first && !marc[split[1].first].empty()){
		if(!marc[split[1].first].empty()){
			possible = {v, id[*marc[split[1].first].begin()]};
		}
	}

	for(auto u : adj[v]){
		if(u != p){

			marc[sub[v]].erase(v);
			marc[sub[v] - sub[u]].insert(v);

			dfs_2(u, v);

			marc[sub[v] - sub[u]].erase(v);
			marc[sub[v]].insert(v);

		}
	}

}

bool is_sub(int a, int b){
	return pre[b] <= pre[a] && pos[a] <= pos[b];
}

bool check(){

	for(int i=1; i<=n; i++) marc[i].clear();

	for(int i=0; i<n; i++) marc[sub[i]].insert(pre[i]);

	dfs_2(0, 0);

	if(possible.first != -1){

		auto [v, u] = possible;

		for(int i=0; i<n; i++){
			if(is_sub(i, v)){
				ans[i] = split[0].second;
			} else if(is_sub(i, u)){
				ans[i] = split[1].second;
			} else ans[i] = split[2].second;
		}

		return true;

	}

	return false;

}

vector<int> find_split(int n_, int a, int b, int c, vector<int> p, vector<int> q){

	n = n_;
	ans.resize(n);

	for(int i=0; i<n; i++) ans[i] = 0;

	possible = {-1, -1};

	split = {{a, 1}, {b, 2}, {c, 3}};

	for(int i=0; i<(n - 1); i++){
		adj[p[i]].push_back(q[i]);
		adj[q[i]].push_back(p[i]);
	}

	sort(split.begin(), split.end());

	dfs_1(0, 0);

	bool ok = false;

	do{

		ok |= check();

	} while(!ok && next_permutation(split.begin(), split.end()));

	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...