#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |