이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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;
vector<int> num;
int cnt = 0;
int dfs(int cn, int pr) {
num[cn] = cnt++;
par[cn] = pr;
int su = 1;
for (int nn : adj[cn]) {
if (num[nn] != -1) continue;
su += dfs(nn, cn);
}
subtrees.push_back({su, cn});
return su;
}
vector<int> flag;
void flag_arb(int cn, int &rem, int fl, bool enf = 0) {
if (rem == 0) return;
flag[cn] = fl;
rem--;
for (int nn : adj[cn]) {
if (enf && num[nn] < num[cn]) continue;
if (flag[nn] != 3) continue;
flag_arb(nn, rem, fl, enf);
}
}
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);
num.assign(n, -1);
for (int i = 0; i < (int)p.size(); i++)
{
adj[p[i]].push_back(q[i]);
adj[q[i]].push_back(p[i]);
}
vector<int> res(n, 0);
bool dfl = 0;
dfs(0, -1);
for (pii i : subtrees) {
if (i.fi >= a && n-i.fi >= b) {
int rem = a;
flag_arb(i.se, rem, 1, 1);
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, 1);
rem = a;
flag_arb(par[i.se], rem, 1);
dfl = 1;
break;
}
}
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... |