이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "bits/stdc++.h"
#include "split.h"
using namespace std;
#define sz(v) ((int)(v).size())
#define pb push_back
const int N = 1e5;
int n, a, b, c;
int oa, ob, oc;
vector<array<int,2>> adj[N+5];
array<int, 2> bigg[N+5];
int p[N+5];
bitset<N+5> v;
bitset<2*N+5> og;
vector<int> va, vb, splist;
int dfs1(int x) {
bigg[x] = {0,0};
v[x] = 1;
int l = 1;
for (auto u : adj[x]) {
if (v[u[0]]) continue;
og[u[1]] = 1;
p[u[0]] = x;
int s = dfs1(u[0]);
l += s;
if (s > bigg[x][0])
bigg[x] = {s, u[0]};
}
if (p[x] != x && n - l > bigg[x][0])
bigg[x] = {n-l, p[x]};
return l;
}
void dfs2(int x, vector<int> &vv) {
v[x] = 1;
vv.pb(x);
for (auto u : adj[x]) {
if (!og[u[1]]) continue;
if (v[u[0]]) continue;
dfs2(u[0], vv);
}
}
void dfs3(int x, vector<int> &vv) {
v[x] = 1;
vv.pb(x);
for (auto u : adj[x]) {
if (!og[u[1]]) {
splist.pb(u[0]);
continue;
}
if (v[u[0]]) continue;
dfs3(u[0], vv);
}
}
int solve(int x) {
v = 0;
va.clear(); vb.clear(); splist.clear();
if (bigg[x][0] >= b) {
v[x] = 1;
dfs2(bigg[x][1], vb);
dfs2(x, va);
return 1;
} else if (p[x] != x) {
v[x] = 1;
dfs3(p[x], vb);
while (sz(splist) && sz(vb) < b) {
auto u = splist.back();
splist.pop_back();
if (v[u]) continue;
dfs2(u, vb);
}
if (sz(vb) < b) return 0;
dfs2(x, va);
return 1;
}
return 0;
}
vector<int>
find_split(int _n, int _a, int _b, int _c, vector<int> p, vector<int>q)
{
n = _n; a = _a; b = _b; c = _c;
ob = a; oc = a+b;
vector<int> ans(n, 0);
if (c < b) { swap(b, c); swap(oc, ob); }
if (c < a) { swap(a, c); swap(oa, oc); }
if (b > a) { swap(a, b); swap(oa, ob); }
/* c > a > b */
for (int i = 0; i < sz(p); ++i) {
adj[p[i]].pb({q[i], i});
adj[q[i]].pb({p[i], i});
}
p[0] = 0;
dfs1(0);
vector<int> cntr;
for (int i = 0; i < n; ++i) {
if (bigg[i][0] <= n/2)
cntr.pb(i);
}
assert(sz(cntr) > 0);
if (solve(cntr[0])^1)
return ans;
assert(sz(va) >= a);
assert(sz(vb) >= b);
v = 0;
for(int i = 0; i < b; ++i) {
ans[i+ob] = vb[i];
v[vb[i]] = 1;
}
for(int i = 0; i < a; ++i) {
ans[i+oa] = va[i];
v[va[i]] = 1;
}
for (int i = 0; i < n; ++i) {
if (!v[i])
ans[oc++] = i;
}
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... |