# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
397710 | ly20 | Split the Attractions (IOI19_split) | C++17 | 0 ms | 0 KiB |
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 "split.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 112345;
bool vl = false;
int resp[MAXN], sub[MAXN];
vector <int> grafo[MAXN];
int p1, p2;
int N;
void dfs1(int v, int p) {
sub[v] = 1;
for(int i = 0; i < grafo[v].size(); i++) {
int viz = grafo[v][i];
if(viz == p) continue;
dfs1(viz, v);
sub[v] += sub[viz];
}
}
void dfs2(int v, int p) {
vl = true;
if(p1 > 0) {
p1--;
resp[v] = 1;
}
for(int i = 0; i < grafo[v].size(); i++) {
int viz = grafo[v][i];
if(viz == p) continue;
dfs2(viz, v);
}
}
void dfs3(int v, int p) {
vl = true;
if(p2 > 0) {
p2--;
resp[v] = 2;
}
for(int i = 0; i < grafo[v].size(); i++) {
int viz = grafo[v][i];
if(viz == p) continue;
dfs3(viz, v);
}
}
bool dfs(int v, int p) {
for(int i = 0; i < grafo[v].size(); i++) {
int viz = grafo[v][i];
if(viz == p) continue;
if(sub[viz] >= b && sub[v] - sub[viz] >= a) {
dfs2(v, viz);
dfs3(viz, v);
return true;
}
if(sub[viz] >= a && sub[v] - sub[viz] >= b) {
dfs2(viz, v);
dfs3(v, viz);
return true;
}
int sp = sub[v], sf = sub[viz];
sub[viz] = sub[v];
sub[v] = sp - sf;
if(dfs(viz, v)) return true;
sub[viz] = sf; sub[v] = sp;
}
}
vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
N = n;
vector<int> res;
int m = p.size();
p1 = a; p2 = b;
for(int i = 0; i < m; i++) {
int a1 = p[i], b1 = q[i];
grafo[a1].push_back(b1); grafo[b1].push_back(a1);
}
dfs1(0, 0);
dfs(0, 0);
for(int i = 0; i < n; i++) {
if(vl && resp[i] == 0) resp[i] = 3;
res.push_back(resp[i]);
}
return res;
}