This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
vector<vector<int>> adj;
vector<pii> subtrees;
vector<int> par;
int dfs(int cn, int pa) {
par[cn] = pa;
int su = 1;
for (int nn : adj[cn]) {
if (nn==pa) continue;
su += dfs(nn, cn);
}
subtrees.push_back({su, cn});
return su;
}
vector<int> flag;
void flag_subtree(int cn, int pa, int fl) {
flag[cn] = fl;
for (int nn : adj[cn]) {
if (nn==pa) continue;
flag_subtree(nn, cn, fl);
}
}
void flag_arb(int cn, int &rem, int fl, int pr = -1) {
if (rem == 0) return;
flag[cn] = fl;
rem--;
for (int nn : adj[cn]) {
if (nn == pr) continue;
if (flag[nn] != 3) continue;
flag_arb(nn, rem, fl);
}
}
vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
adj.assign(n, {});
par.assign(n, -1);
flag.assign(n, 3);
for (int i = 0; i < (int)p.size(); i++)
{
adj[p[i]].push_back(q[i]);
adj[q[i]].push_back(p[i]);
}
dfs(0, -1);
bool dfl = 0;
for (pii i : subtrees) {
if (i.fi >= a && n-i.fi >= b) {
int rem = a;
flag_arb(i.se, rem, 1, par[i.se]);
rem = b;
flag_arb(par[i.se], rem, 2);
dfl = 1;
break;
}
if (i.fi >= b && n-i.fi >= a) {
int rem = b;
flag_arb(i.se, rem, 2, par[i.se]);
rem = a;
flag_arb(par[i.se], rem, 1);
dfl = 1;
break;
}
}
vector<int> res(n, 0);
if (dfl) {
res = flag;
}
return res;
}
# | 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... |