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"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
#define mp make_pair
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
pii T[3];
const int N = (int)1e5 + 10;
vector<int> Z[N];
vector<int> C[N];
int subt[N];
int par[N];
void dfs(int u){
subt[u] = 1;
for(auto x : Z[u]){
if(subt[x] == 0){
par[x]=u;
C[x].push_back(u);
C[u].push_back(x);
dfs(x);
subt[u] += subt[x];
}
}
}
vector<int> ret;
void solve(int id, int pp, int ass){
ret[id] = T[ass].se;
if(T[ass].fi == 0){
ret[id] = T[2].se;
}
else{
T[ass].fi -- ;
}
for(auto x : C[id]){
if(x == pp) continue;
solve(x, id, ass);
}
}
int curn;
vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
ret.resize(n);
curn = n;
for(int i = 0 ; i < n; i ++ )
ret[i] = 0;
T[0] = mp(a, 1);
T[1] = mp(b, 2);
T[2] = mp(c, 3);
sort(T, T + 3);
for(int i = 0 ; i < p.size(); i ++ ){
Z[p[i]].push_back(q[i]);
Z[q[i]].push_back(p[i]);
}
int root;
deque<pii> degs;
for(int i = 0 ; i < n; i ++ ){
degs.push_back(mp((int)Z[i].size(), i));
}
for(int it = 0 ; it < n; it ++ ){
if(n <= 2500){
root = it;
}
else{
if(it > 50) break;
if(it <= 20 || degs.empty())
root = ((int)rng() % n + n) % n;
else{
if(it % 2 == 0){
root = degs.back().se;
degs.pop_back();
}
else{
root = degs.front().se;
degs.pop_front();
}
}
}
root = ((int)rng() % n + n) % n;
for(int i = 0 ; i < n; i ++ ){
subt[i] = 0;
C[i].clear();
}
dfs(root);
for(int cut = 0; cut < n; cut ++ ){
if(subt[cut] >= T[0].fi && n - subt[cut] >= T[1].fi){
solve(cut, par[cut], 0);
solve(par[cut], cut, 1);
return ret;
}
else if(subt[cut] >= T[1].fi && n - subt[cut] >= T[0].fi){
solve(cut, par[cut], 1);
solve(par[cut], cut, 0);
return ret;
}
}
}
return ret;
}
Compilation message (stderr)
split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:64:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
64 | for(int i = 0 ; i < p.size(); i ++ ){
| ~~^~~~~~~~~~
# | 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... |