#include <bits/stdc++.h>
#include "catdog.h"
using namespace std;
#define vi vector<int>
#define pb push_back
#define maxn 100000
int n;
vi adj[maxn], rpos;
int par[maxn], root[maxn], depth[maxn], sz[maxn], ti;
int hlLen[maxn];
int hlPos[maxn];
int pos[maxn];
int state[maxn+1];
struct node {
int catcat, catdog = maxn, dogcat = maxn, dogdog;
};
struct SegTree {
int catcat, catdog, dogcat, dogdog;
vector<node> nodes;
int n;
void init(int sz) {
n = sz;
nodes.resize(4*sz);
}
void upd(int p, int i, int j, int u, int cc, int cd, int dc, int dd) {
if (i > u || j < u) return;
if (i == j && i == u) {
nodes[p].catcat += cc;
nodes[p].catdog += cd;
nodes[p].dogcat += dc;
nodes[p].dogdog += dd;
return;
}
upd(p*2, i, (i+j)/2, u, cc, cd, dc, dd);
upd(p*2+1, (i+j)/2+1, j, u, cc, cd, dc, dd);
nodes[p].catcat = min(min(nodes[p*2].catcat, nodes[p*2].catdog+1) + nodes[p*2+1].catcat, min(nodes[p*2].catcat+1, nodes[p*2].catdog) + nodes[p*2+1].dogcat);
nodes[p].catdog = min(min(nodes[p*2].catcat, nodes[p*2].catdog+1) + nodes[p*2+1].catdog, min(nodes[p*2].catcat+1, nodes[p*2].catdog) + nodes[p*2+1].dogdog);
nodes[p].dogdog = min(min(nodes[p*2].dogcat, nodes[p*2].dogdog+1) + nodes[p*2+1].catdog, min(nodes[p*2].dogcat+1, nodes[p*2].dogdog) + nodes[p*2+1].dogdog);
nodes[p].dogcat = min(min(nodes[p*2].dogcat, nodes[p*2].dogdog+1) + nodes[p*2+1].catcat, min(nodes[p*2].dogcat+1, nodes[p*2].dogdog) + nodes[p*2+1].dogcat);
}
void upd(int u, int cc, int cd, int dc, int dd) {
upd(1, 0, n-1, u, cc, cd, dc, dd);
catcat = nodes[1].catcat;
catdog = nodes[1].catdog;
dogcat = nodes[1].dogcat;
dogdog = nodes[1].dogdog;
}
};
SegTree st[maxn];
void dfsSz(int x) {
sz[x] = 1;
for (int &v : adj[x]) {
par[v] = x; depth[v] = depth[x] + 1;
adj[v].erase(find(adj[v].begin(), adj[v].end(), x));
dfsSz(v); sz[x] += sz[v];
if (sz[v] > sz[adj[x][0]]) swap(v, adj[x][0]);
}
}
void dfsHld(int x) {
hlPos[x] = hlLen[root[x]]++;
pos[x] = ti++; rpos.pb(x);
for (int v : adj[x]) {
root[v] = (v == adj[x][0] ? root[x] : v);
dfsHld(v);
}
}
void process(int x, int catcat, int catdog, int dogcat, int dogdog) {
for (; ; x = par[root[x]]) {
int prevcatcat = min(st[root[x]].catcat, min(st[root[x]].catdog, min(st[root[x]].dogcat+1, st[root[x]].dogdog+1)));
int prevdogdog = min(st[root[x]].catcat+1, min(st[root[x]].catdog+1, min(st[root[x]].dogcat, st[root[x]].dogdog)));
st[root[x]].upd(hlPos[x], catcat, catdog, dogcat, dogdog);
catcat = min(st[root[x]].catcat, min(st[root[x]].catdog, min(st[root[x]].dogcat+1, st[root[x]].dogdog+1)));
dogdog = min(st[root[x]].catcat+1, min(st[root[x]].catdog+1, min(st[root[x]].dogcat, st[root[x]].dogdog)));
catcat -= prevcatcat;
dogdog -= prevdogdog;
if (root[x] == 0) return;
}
}
void initialize(int N, vi A, vi B) {
n = N;
for (int i = 0; i < n-1; i++) {
adj[A[i]-1].pb(B[i]-1);
adj[B[i]-1].pb(A[i]-1);
}
par[0] = depth[0] = ti = 0; dfsSz(0);
root[0] = 0; dfsHld(0);
for (int i = 0; i < n; i++) {
if (root[i] == i) {
st[i].init(hlLen[i]);
}
}
}
int cat(int v) {
state[v] = 1;
process(v-1, 0, 0, 0, maxn);
return min(st[0].catcat, min(st[0].catdog, min(st[0].dogdog, st[0].dogcat)));
}
int dog(int v) {
state[v] = 2;
process(v-1, maxn, 0, 0, 0);
return min(st[0].catcat, min(st[0].catdog, min(st[0].dogdog, st[0].dogcat)));
}
int neighbor(int v) {
process(v-1, state[v] == 2 ? -maxn : 0, 0, 0, state[v] == 1 ? -maxn : 0);
state[v] = 0;
return min(st[0].catcat, min(st[0].catdog, min(st[0].dogdog, st[0].dogcat)));
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
7424 KB |
Output is correct |
2 |
Correct |
5 ms |
7424 KB |
Output is correct |
3 |
Correct |
5 ms |
7424 KB |
Output is correct |
4 |
Correct |
5 ms |
7424 KB |
Output is correct |
5 |
Correct |
5 ms |
7424 KB |
Output is correct |
6 |
Correct |
5 ms |
7456 KB |
Output is correct |
7 |
Correct |
5 ms |
7424 KB |
Output is correct |
8 |
Correct |
5 ms |
7424 KB |
Output is correct |
9 |
Correct |
5 ms |
7424 KB |
Output is correct |
10 |
Correct |
5 ms |
7424 KB |
Output is correct |
11 |
Correct |
5 ms |
7424 KB |
Output is correct |
12 |
Correct |
5 ms |
7424 KB |
Output is correct |
13 |
Correct |
5 ms |
7424 KB |
Output is correct |
14 |
Correct |
5 ms |
7424 KB |
Output is correct |
15 |
Correct |
5 ms |
7424 KB |
Output is correct |
16 |
Correct |
5 ms |
7424 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
7424 KB |
Output is correct |
2 |
Correct |
5 ms |
7424 KB |
Output is correct |
3 |
Correct |
5 ms |
7424 KB |
Output is correct |
4 |
Correct |
5 ms |
7424 KB |
Output is correct |
5 |
Correct |
5 ms |
7424 KB |
Output is correct |
6 |
Correct |
5 ms |
7456 KB |
Output is correct |
7 |
Correct |
5 ms |
7424 KB |
Output is correct |
8 |
Correct |
5 ms |
7424 KB |
Output is correct |
9 |
Correct |
5 ms |
7424 KB |
Output is correct |
10 |
Correct |
5 ms |
7424 KB |
Output is correct |
11 |
Correct |
5 ms |
7424 KB |
Output is correct |
12 |
Correct |
5 ms |
7424 KB |
Output is correct |
13 |
Correct |
5 ms |
7424 KB |
Output is correct |
14 |
Correct |
5 ms |
7424 KB |
Output is correct |
15 |
Correct |
5 ms |
7424 KB |
Output is correct |
16 |
Correct |
5 ms |
7424 KB |
Output is correct |
17 |
Correct |
6 ms |
7552 KB |
Output is correct |
18 |
Correct |
6 ms |
7552 KB |
Output is correct |
19 |
Correct |
6 ms |
7680 KB |
Output is correct |
20 |
Correct |
5 ms |
7424 KB |
Output is correct |
21 |
Correct |
6 ms |
7424 KB |
Output is correct |
22 |
Correct |
6 ms |
7424 KB |
Output is correct |
23 |
Correct |
6 ms |
7552 KB |
Output is correct |
24 |
Correct |
6 ms |
7552 KB |
Output is correct |
25 |
Correct |
6 ms |
7552 KB |
Output is correct |
26 |
Correct |
6 ms |
7424 KB |
Output is correct |
27 |
Correct |
5 ms |
7552 KB |
Output is correct |
28 |
Correct |
6 ms |
7552 KB |
Output is correct |
29 |
Correct |
6 ms |
7552 KB |
Output is correct |
30 |
Correct |
6 ms |
7424 KB |
Output is correct |
31 |
Correct |
5 ms |
7680 KB |
Output is correct |
32 |
Correct |
6 ms |
7424 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
7424 KB |
Output is correct |
2 |
Correct |
5 ms |
7424 KB |
Output is correct |
3 |
Correct |
5 ms |
7424 KB |
Output is correct |
4 |
Correct |
5 ms |
7424 KB |
Output is correct |
5 |
Correct |
5 ms |
7424 KB |
Output is correct |
6 |
Correct |
5 ms |
7456 KB |
Output is correct |
7 |
Correct |
5 ms |
7424 KB |
Output is correct |
8 |
Correct |
5 ms |
7424 KB |
Output is correct |
9 |
Correct |
5 ms |
7424 KB |
Output is correct |
10 |
Correct |
5 ms |
7424 KB |
Output is correct |
11 |
Correct |
5 ms |
7424 KB |
Output is correct |
12 |
Correct |
5 ms |
7424 KB |
Output is correct |
13 |
Correct |
5 ms |
7424 KB |
Output is correct |
14 |
Correct |
5 ms |
7424 KB |
Output is correct |
15 |
Correct |
5 ms |
7424 KB |
Output is correct |
16 |
Correct |
5 ms |
7424 KB |
Output is correct |
17 |
Correct |
6 ms |
7552 KB |
Output is correct |
18 |
Correct |
6 ms |
7552 KB |
Output is correct |
19 |
Correct |
6 ms |
7680 KB |
Output is correct |
20 |
Correct |
5 ms |
7424 KB |
Output is correct |
21 |
Correct |
6 ms |
7424 KB |
Output is correct |
22 |
Correct |
6 ms |
7424 KB |
Output is correct |
23 |
Correct |
6 ms |
7552 KB |
Output is correct |
24 |
Correct |
6 ms |
7552 KB |
Output is correct |
25 |
Correct |
6 ms |
7552 KB |
Output is correct |
26 |
Correct |
6 ms |
7424 KB |
Output is correct |
27 |
Correct |
5 ms |
7552 KB |
Output is correct |
28 |
Correct |
6 ms |
7552 KB |
Output is correct |
29 |
Correct |
6 ms |
7552 KB |
Output is correct |
30 |
Correct |
6 ms |
7424 KB |
Output is correct |
31 |
Correct |
5 ms |
7680 KB |
Output is correct |
32 |
Correct |
6 ms |
7424 KB |
Output is correct |
33 |
Correct |
125 ms |
15844 KB |
Output is correct |
34 |
Correct |
79 ms |
18040 KB |
Output is correct |
35 |
Correct |
112 ms |
14576 KB |
Output is correct |
36 |
Correct |
215 ms |
23608 KB |
Output is correct |
37 |
Correct |
28 ms |
12408 KB |
Output is correct |
38 |
Correct |
243 ms |
25440 KB |
Output is correct |
39 |
Correct |
258 ms |
25440 KB |
Output is correct |
40 |
Correct |
243 ms |
25440 KB |
Output is correct |
41 |
Correct |
242 ms |
25568 KB |
Output is correct |
42 |
Correct |
250 ms |
25440 KB |
Output is correct |
43 |
Correct |
234 ms |
25440 KB |
Output is correct |
44 |
Correct |
233 ms |
25568 KB |
Output is correct |
45 |
Correct |
241 ms |
25568 KB |
Output is correct |
46 |
Correct |
240 ms |
25568 KB |
Output is correct |
47 |
Correct |
238 ms |
25440 KB |
Output is correct |
48 |
Correct |
90 ms |
21056 KB |
Output is correct |
49 |
Correct |
107 ms |
24480 KB |
Output is correct |
50 |
Correct |
32 ms |
11128 KB |
Output is correct |
51 |
Correct |
42 ms |
14172 KB |
Output is correct |
52 |
Correct |
22 ms |
10880 KB |
Output is correct |
53 |
Correct |
145 ms |
23800 KB |
Output is correct |
54 |
Correct |
78 ms |
14764 KB |
Output is correct |
55 |
Correct |
178 ms |
20324 KB |
Output is correct |
56 |
Correct |
104 ms |
15776 KB |
Output is correct |
57 |
Correct |
160 ms |
22964 KB |
Output is correct |
58 |
Correct |
36 ms |
14708 KB |
Output is correct |
59 |
Correct |
44 ms |
13688 KB |
Output is correct |
60 |
Correct |
93 ms |
22648 KB |
Output is correct |
61 |
Correct |
101 ms |
23264 KB |
Output is correct |
62 |
Correct |
69 ms |
19952 KB |
Output is correct |
63 |
Correct |
55 ms |
17912 KB |
Output is correct |
64 |
Correct |
60 ms |
19572 KB |
Output is correct |
65 |
Correct |
88 ms |
26868 KB |
Output is correct |
66 |
Correct |
58 ms |
12536 KB |
Output is correct |
67 |
Correct |
74 ms |
21104 KB |
Output is correct |
68 |
Correct |
138 ms |
27380 KB |
Output is correct |
69 |
Correct |
30 ms |
9344 KB |
Output is correct |
70 |
Correct |
11 ms |
7680 KB |
Output is correct |
71 |
Correct |
61 ms |
16372 KB |
Output is correct |
72 |
Correct |
97 ms |
23540 KB |
Output is correct |
73 |
Correct |
171 ms |
30196 KB |
Output is correct |
74 |
Correct |
182 ms |
27252 KB |
Output is correct |
75 |
Correct |
163 ms |
29940 KB |
Output is correct |
76 |
Correct |
159 ms |
29044 KB |
Output is correct |
77 |
Correct |
180 ms |
27512 KB |
Output is correct |