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>
#include "split.h"
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;
const int N = 1e5 + 7;
int n, tim, f = -1;
int bio[N], st[N], ba[N], siz[N];
vector <int> no;
vector <int> adj[N], gadj[N];
vector <pii> fo, u;
void dfs(int x, int p = -1) {
bio[x] = 1;
st[x] = tim++;
ba[x] = st[x];
siz[x] = 1;
int mx = 0, sum = 0;
for (auto y : adj[x]) {
if (y == p) continue;
if (bio[y]) {
if (st[y] < st[x]) ba[x] = min(ba[x], st[y]);
continue;
}
dfs(y, x);
ba[x] = min(ba[x], ba[y]);
siz[x] += siz[y];
mx = max(mx, siz[y]);
gadj[x].pb(y);
gadj[y].pb(x);
}
mx = max(mx, n-siz[x]);
if (mx <= n/2 && f == -1) {
f = x;
for (auto y : adj[x]) if (st[y] > st[x] && ba[y] >= st[x]) fo.pb({siz[y], y});
if (p != -1) {
u.pb({n-siz[x], p});
for (auto y : adj[x]) if (st[y] > st[x] && ba[y] < st[x]) u.pb({siz[y], y});
}
}
}
void ldfs(int x) {
no.pb(x);
bio[x] = 1;
for (auto y : gadj[x]) if (!bio[y]) ldfs(y);
}
vector <int> find_split(int nn, int a, int b, int c, vector <int> p, vector <int> q) {
n = nn;
int m = p.size();
int ca = 1, cb = 2, cc = 3;
if (a > b) {swap(a, b); swap(ca, cb);};
if (a > c) {swap(a, c); swap(ca, cc);};
if (b > c) {swap(c, b); swap(cc, cb);};
for (int i = 0; i < m; i++) {
adj[p[i]].pb(q[i]);
adj[q[i]].pb(p[i]);
}
dfs(0);
memset(bio, 0, sizeof bio);
int x = f, sum = 0;
sort(all(fo)); sort(all(u)); reverse(all(u));
for (auto it : u) sum += it.F;
vector <int> res(n, 0);
if (!(!fo.empty() && fo.back().F >= a) && sum < a) return res;
bio[x] = 1;
for (int i = 0; i < n; i++) res[i] = cc;
if (sum < a) ldfs(fo.back().S);
else {
sum = 0;
for (int i = 0; i < u.size(); i++) {
sum += u[i].F;
if (sum < a) ldfs(u[i].S);
else {
vector <int> tmp; tmp = no; no.clear();
ldfs(u[i].S);
for (auto y : no) bio[y] = 0;
int fx = u[i].S;
for (auto y : no) {
for (auto z : adj[y]) {
if (bio[z] && z != x) fx = y;
}
if (fx != -1) break;
}
no.clear();
no = tmp;
ldfs(fx);
break;
}
}
}
for (int i = 0; i < a; i++) res[no[i]] = ca;
no.clear();
ldfs(x);
if (no.size() < b) exit(0);
for (int i = 0; i < b; i++) res[no[i]] = cb;
return res;
}
Compilation message (stderr)
split.cpp: In function 'void dfs(int, int)':
split.cpp:28:18: warning: unused variable 'sum' [-Wunused-variable]
28 | int mx = 0, sum = 0;
| ^~~
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:88:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
88 | for (int i = 0; i < u.size(); i++) {
| ~~^~~~~~~~~~
split.cpp:113:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
113 | if (no.size() < b) exit(0);
| ~~~~~~~~~~^~~
# | 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... |