#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n, m, q;
struct node {
int d;
node *l, *r;
node(int d, node *l, node *r) : d(d), l(l), r(r) { }
};
node* newleaf(int d) { return new node(d, nullptr, nullptr); }
node* newpar(node *l, node *r) { return new node(l->d + r->d, l, r); }
node* build(int l = 1, int r = n) {
if(l == r) return newleaf(0);
int mid = (l + r) >> 1;
return newpar(build(l, mid), build(mid+1, r));
}
node* update(node *p, int x, int l = 1, int r = n) {
if(l == r) return newleaf(p->d + 1);
int mid = (l + r) >> 1;
if(x <= mid) return newpar(update(p->l, x, l, mid), p->r);
else return newpar(p->l, update(p->r, x, mid+1, r));
}
int query(node *pl, node *pr, int x, int y, int l = 1, int r = n) {
if(x > r || l > y) return 0;
if(x <= l && r <= y) return pr->d - pl->d;
int mid = (l + r) >> 1;
return query(pl->l, pr->l, x, y, l, mid) + query(pl->r, pr->r, x, y, mid+1, r);
}
node* t[N];
int dsu[N], hpar[N][18], wpar[N][18];
int hin[N], hout[N], hpos[N];
int win[N], wout[N], wpos[N];
vector<int> g[N], hg[N], wg[N];
int find(int x) { return dsu[x] = x == dsu[x] ? x : find(dsu[x]); }
void gen_human(int u, int p) {
static int hidx = 0;
hin[u] = ++hidx, hpos[hidx] = u;
hpar[u][0] = p;
for(int i = 1; i <= 17; i++) hpar[u][i] = hpar[hpar[u][i-1]][i-1];
for(int v : hg[u]) if(v != p) gen_human(v, u);
hout[u] = hidx;
}
void gen_werewolf(int u, int p) {
static int widx = 0;
win[u] = ++widx, wpos[widx] = u;
wpar[u][0] = p;
for(int i = 1; i <= 17; i++) wpar[u][i] = wpar[wpar[u][i-1]][i-1];
for(int v : wg[u]) if(v != p) gen_werewolf(v, u);
wout[u] = widx;
}
vector<int> check_validity(int _n, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) {
n = _n, m = X.size(), q = S.size();
for(int i = 0; i < m; i++) {
g[X[i]+1].emplace_back(Y[i]+1);
g[Y[i]+1].emplace_back(X[i]+1);
}
iota(dsu, dsu+N, 0);
for(int u = n; u; u--) for(int v : g[u]) if(v > u) {
int pv = find(v);
if(pv == u) continue;
hg[u].emplace_back(pv), hg[pv].emplace_back(u);
dsu[pv] = u;
}
iota(dsu, dsu+N, 0);
for(int u = 1; u <= n; u++) for(int v : g[u]) if(v < u) {
int pv = find(v);
if(pv == u) continue;
wg[u].emplace_back(pv), wg[pv].emplace_back(u);
dsu[pv] = u;
}
gen_human(1, 0), gen_werewolf(n, 0);
t[0] = build();
for(int i = 1; i <= n; i++) t[i] = update(t[i-1], win[hpos[i]]);
vector<int> ret;
for(int T = 0; T < q; T++) {
int s = S[T]+1, e = E[T]+1;
for(int i = 17; ~i; i--) if(hpar[s][i] && hpar[s][i] >= L[T]+1) s = hpar[s][i];
for(int i = 17; ~i; i--) if(wpar[e][i] && wpar[e][i] <= R[T]+1) e = wpar[e][i];
if(query(t[hin[s]-1], t[hout[s]], win[e], wout[e])) ret.emplace_back(1);
else ret.emplace_back(0);
}
return ret;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
20 ms |
15360 KB |
Output is correct |
2 |
Correct |
17 ms |
15360 KB |
Output is correct |
3 |
Correct |
18 ms |
15224 KB |
Output is correct |
4 |
Correct |
16 ms |
15232 KB |
Output is correct |
5 |
Correct |
16 ms |
15360 KB |
Output is correct |
6 |
Correct |
16 ms |
15360 KB |
Output is correct |
7 |
Correct |
18 ms |
15360 KB |
Output is correct |
8 |
Correct |
16 ms |
15232 KB |
Output is correct |
9 |
Correct |
16 ms |
15304 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
20 ms |
15360 KB |
Output is correct |
2 |
Correct |
17 ms |
15360 KB |
Output is correct |
3 |
Correct |
18 ms |
15224 KB |
Output is correct |
4 |
Correct |
16 ms |
15232 KB |
Output is correct |
5 |
Correct |
16 ms |
15360 KB |
Output is correct |
6 |
Correct |
16 ms |
15360 KB |
Output is correct |
7 |
Correct |
18 ms |
15360 KB |
Output is correct |
8 |
Correct |
16 ms |
15232 KB |
Output is correct |
9 |
Correct |
16 ms |
15304 KB |
Output is correct |
10 |
Correct |
27 ms |
17664 KB |
Output is correct |
11 |
Correct |
30 ms |
17756 KB |
Output is correct |
12 |
Correct |
26 ms |
17664 KB |
Output is correct |
13 |
Correct |
26 ms |
17920 KB |
Output is correct |
14 |
Correct |
28 ms |
17784 KB |
Output is correct |
15 |
Correct |
30 ms |
17784 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1456 ms |
211120 KB |
Output is correct |
2 |
Correct |
1663 ms |
214344 KB |
Output is correct |
3 |
Correct |
1448 ms |
212104 KB |
Output is correct |
4 |
Correct |
1301 ms |
211188 KB |
Output is correct |
5 |
Correct |
1228 ms |
211260 KB |
Output is correct |
6 |
Correct |
1520 ms |
211100 KB |
Output is correct |
7 |
Correct |
1422 ms |
211072 KB |
Output is correct |
8 |
Correct |
1734 ms |
214492 KB |
Output is correct |
9 |
Correct |
1291 ms |
212140 KB |
Output is correct |
10 |
Correct |
943 ms |
211280 KB |
Output is correct |
11 |
Correct |
1027 ms |
211188 KB |
Output is correct |
12 |
Correct |
1096 ms |
211056 KB |
Output is correct |
13 |
Correct |
1488 ms |
215560 KB |
Output is correct |
14 |
Correct |
1580 ms |
215708 KB |
Output is correct |
15 |
Correct |
1541 ms |
215840 KB |
Output is correct |
16 |
Correct |
1478 ms |
215668 KB |
Output is correct |
17 |
Correct |
1237 ms |
210940 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
20 ms |
15360 KB |
Output is correct |
2 |
Correct |
17 ms |
15360 KB |
Output is correct |
3 |
Correct |
18 ms |
15224 KB |
Output is correct |
4 |
Correct |
16 ms |
15232 KB |
Output is correct |
5 |
Correct |
16 ms |
15360 KB |
Output is correct |
6 |
Correct |
16 ms |
15360 KB |
Output is correct |
7 |
Correct |
18 ms |
15360 KB |
Output is correct |
8 |
Correct |
16 ms |
15232 KB |
Output is correct |
9 |
Correct |
16 ms |
15304 KB |
Output is correct |
10 |
Correct |
27 ms |
17664 KB |
Output is correct |
11 |
Correct |
30 ms |
17756 KB |
Output is correct |
12 |
Correct |
26 ms |
17664 KB |
Output is correct |
13 |
Correct |
26 ms |
17920 KB |
Output is correct |
14 |
Correct |
28 ms |
17784 KB |
Output is correct |
15 |
Correct |
30 ms |
17784 KB |
Output is correct |
16 |
Correct |
1456 ms |
211120 KB |
Output is correct |
17 |
Correct |
1663 ms |
214344 KB |
Output is correct |
18 |
Correct |
1448 ms |
212104 KB |
Output is correct |
19 |
Correct |
1301 ms |
211188 KB |
Output is correct |
20 |
Correct |
1228 ms |
211260 KB |
Output is correct |
21 |
Correct |
1520 ms |
211100 KB |
Output is correct |
22 |
Correct |
1422 ms |
211072 KB |
Output is correct |
23 |
Correct |
1734 ms |
214492 KB |
Output is correct |
24 |
Correct |
1291 ms |
212140 KB |
Output is correct |
25 |
Correct |
943 ms |
211280 KB |
Output is correct |
26 |
Correct |
1027 ms |
211188 KB |
Output is correct |
27 |
Correct |
1096 ms |
211056 KB |
Output is correct |
28 |
Correct |
1488 ms |
215560 KB |
Output is correct |
29 |
Correct |
1580 ms |
215708 KB |
Output is correct |
30 |
Correct |
1541 ms |
215840 KB |
Output is correct |
31 |
Correct |
1478 ms |
215668 KB |
Output is correct |
32 |
Correct |
1237 ms |
210940 KB |
Output is correct |
33 |
Correct |
1901 ms |
212076 KB |
Output is correct |
34 |
Correct |
457 ms |
37744 KB |
Output is correct |
35 |
Correct |
2367 ms |
214256 KB |
Output is correct |
36 |
Correct |
1874 ms |
211476 KB |
Output is correct |
37 |
Correct |
2262 ms |
213928 KB |
Output is correct |
38 |
Correct |
1973 ms |
211956 KB |
Output is correct |
39 |
Correct |
2093 ms |
220804 KB |
Output is correct |
40 |
Correct |
1832 ms |
217204 KB |
Output is correct |
41 |
Correct |
1926 ms |
213184 KB |
Output is correct |
42 |
Correct |
1165 ms |
211324 KB |
Output is correct |
43 |
Correct |
2494 ms |
216912 KB |
Output is correct |
44 |
Correct |
2077 ms |
213616 KB |
Output is correct |
45 |
Correct |
1712 ms |
220768 KB |
Output is correct |
46 |
Correct |
1875 ms |
220652 KB |
Output is correct |
47 |
Correct |
1457 ms |
215404 KB |
Output is correct |
48 |
Correct |
1548 ms |
215452 KB |
Output is correct |
49 |
Correct |
1667 ms |
215440 KB |
Output is correct |
50 |
Correct |
1487 ms |
215752 KB |
Output is correct |
51 |
Correct |
1679 ms |
217812 KB |
Output is correct |
52 |
Correct |
1651 ms |
217536 KB |
Output is correct |