#include "werewolf.h"
#include <iostream>
#include <vector>
#define f first
#define s second
using namespace std;
int n, m, q, p[200010], id[200010], pmax[600010][21], pmin[600010][21], vmax[600010], vmin[600010], mxsz, mnsz, cnt;
pair<int,int> rmax[600010], rmin[600010];
vector<int> edge[200010], maxx[600010], minn[600010], node[800010], ps[800010];
int dsu(int u) {
if (p[u] == u) return u;
return (p[u] = dsu(p[u]));
}
void buildmax(int u) {
int v = pmax[u][0];
for (int i = 1; i <= 20; i++) {
if (v == -1) break;
pmax[u][i] = pmax[v][i-1];
v = pmax[u][i];
}
if (maxx[u].empty()) {
++cnt;
rmax[u] = {cnt,cnt};
return;
}
for (int i = 0; i < maxx[u].size(); i++) {
buildmax(maxx[u][i]);
rmax[u] = {min(rmax[u].f,rmax[maxx[u][i]].f),max(rmax[u].s,rmax[maxx[u][i]].s)};
}
}
void buildmin(int u) {
int v = pmin[u][0];
for (int i = 1; i <= 20; i++) {
if (v == -1) break;
pmin[u][i] = pmin[v][i-1];
v = pmin[u][i];
}
if (minn[u].empty()) {
node[1].push_back(rmax[u].f);
rmin[u] = {cnt,cnt};
cnt++;
return;
}
for (int i = 0; i < minn[u].size(); i++) {
buildmin(minn[u][i]);
rmin[u] = {min(rmin[u].f,rmin[minn[u][i]].f),max(rmin[u].s,rmin[minn[u][i]].s)};
}
}
void build(int id, int x, int y) {
if (x == y) return;
int mid = (x+y)/2, sum = 0;
for (int i = 0; i < node[id].size(); i++) {
if (node[id][i] <= mid) {
ps[id].push_back(++sum);
node[id*2].push_back(node[id][i]);
} else {
ps[id].push_back(sum);
node[id*2+1].push_back(node[id][i]);
}
}
build(id*2,x,mid);
build(id*2+1,mid+1,y);
}
//654213
int query(int id, int x, int y, int l, int r, int pos) {
/*for (int i = 0; i < ps[id].size(); i++) cout << ps[id][i] << " ";
cout << endl;
cout << "e " << x << " " << y << " " << pos << endl;*/
if (pos == -1) return 0;
if ((l <= x) && (y <= r)) return pos+1;
if ((y < l) || (r < x)) return 0;
int mid = (x+y)/2;
return query(id*2,x,mid,l,r,ps[id][pos]-1)+query(id*2+1,mid+1,y,l,r,pos-ps[id][pos]);
}
std::vector<signed> check_validity(signed N, std::vector<signed> X, std::vector<signed> Y, std::vector<signed> S, std::vector<signed> E, std::vector<signed> L, std::vector<signed> R) {
vector<int> ans;
n = N; m = X.size(); q = S.size();
for (int i = 0; i < m; i++) {
edge[X[i]].push_back(Y[i]);
edge[Y[i]].push_back(X[i]);
}
for (int i = 0; i < n+m; i++) for (int j = 0; j <= 20; j++) pmax[i][j] = pmin[i][j] = -1;
for (int i = 0; i < n; i++) p[i] = id[i] = vmin[i] = i;
mnsz = n-1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < edge[i].size(); j++) {
if (edge[i][j] < i) {
int u = edge[i][j], v = i;
if (p[dsu(u)] != p[dsu(v)]) {
++mnsz;
pmin[id[p[dsu(u)]]][0] = pmin[id[p[dsu(v)]]][0] = mnsz;
minn[mnsz].push_back(id[p[dsu(u)]]);
minn[mnsz].push_back(id[p[dsu(v)]]);
p[dsu(v)] = p[dsu(u)];
id[p[dsu(u)]] = mnsz;
vmin[mnsz] = i;
}
}
}
}
mxsz = n-1;
for (int i = 0; i < n; i++) p[i] = id[i] = vmax[i] = i;
for (int i = n-1; i >= 0; i--) {
for (int j = 0; j < edge[i].size(); j++) {
if (edge[i][j] > i) {
int u = edge[i][j], v = i;
if (p[dsu(u)] != p[dsu(v)]) {
++mxsz;
pmax[id[p[dsu(u)]]][0] = pmax[id[p[dsu(v)]]][0] = mxsz;
maxx[mxsz].push_back(id[p[dsu(u)]]);
maxx[mxsz].push_back(id[p[dsu(v)]]);
p[dsu(v)] = p[dsu(u)];
id[p[dsu(u)]] = mxsz;
vmax[mxsz] = i;
}
}
}
}
for (int i = 0; i <= mxsz; i++) rmax[i] = {1e9,-1e9};
for (int i = 0; i <= mnsz; i++) rmin[i] = {1e9,-1e9};
buildmax(mxsz);
cnt = 0;
buildmin(mnsz);
build(1,1,n);
/*for (int i = 0; i < node[1].size(); i++) cout << node[1][i] << " ";
cout << endl;*/
for (int _ = 0; _ < q; _++) {
int u = S[_], v = E[_], l = L[_], r = R[_];
for (int j = 20; j >= 0; j--) if ((pmax[u][j] != -1) && (vmax[pmax[u][j]] >= l)) u = pmax[u][j];
for (int j = 20; j >= 0; j--) if ((pmin[v][j] != -1) && (vmin[pmin[v][j]] <= r)) v = pmin[v][j];
/*int sum = 0;
for (int i = rmin[v].f; i <= rmin[v].s; i++) {
if ((rmax[u].f <= node[1][i]) && (node[1][i] <= rmax[u].s)) {
sum++;
}
}
cout << "f ";
cout << rmin[v].f << " " << rmin[v].s << " " << rmax[u].f << " " << rmax[u].s; // << " " << sum << " " << query(1,1,n,rmax[u].f,rmax[u].s,rmin[v].s)-query(1,1,n,rmax[u].f,rmax[u].s,rmin[v].f-1) << endl;*/
if (rmin[v].f) ans.push_back(query(1,1,n,rmax[u].f,rmax[u].s,rmin[v].s)-query(1,1,n,rmax[u].f,rmax[u].s,rmin[v].f-1) > 0);
else ans.push_back(query(1,1,n,rmax[u].f,rmax[u].s,rmin[v].s) > 0);
}
return ans;
}
Compilation message
werewolf.cpp: In function 'void buildmax(int)':
werewolf.cpp:29:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
29 | for (int i = 0; i < maxx[u].size(); i++) {
| ~~^~~~~~~~~~~~~~~~
werewolf.cpp: In function 'void buildmin(int)':
werewolf.cpp:48:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
48 | for (int i = 0; i < minn[u].size(); i++) {
| ~~^~~~~~~~~~~~~~~~
werewolf.cpp: In function 'void build(int, int, int)':
werewolf.cpp:57:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
57 | for (int i = 0; i < node[id].size(); i++) {
| ~~^~~~~~~~~~~~~~~~~
werewolf.cpp: In function 'std::vector<int> check_validity(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
werewolf.cpp:92:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
92 | for (int j = 0; j < edge[i].size(); j++) {
| ~~^~~~~~~~~~~~~~~~
werewolf.cpp:110:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
110 | for (int j = 0; j < edge[i].size(); j++) {
| ~~^~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
37 ms |
70776 KB |
Output is correct |
2 |
Correct |
31 ms |
70780 KB |
Output is correct |
3 |
Correct |
31 ms |
70744 KB |
Output is correct |
4 |
Correct |
30 ms |
70692 KB |
Output is correct |
5 |
Correct |
31 ms |
70852 KB |
Output is correct |
6 |
Correct |
30 ms |
70860 KB |
Output is correct |
7 |
Correct |
36 ms |
70860 KB |
Output is correct |
8 |
Correct |
31 ms |
70860 KB |
Output is correct |
9 |
Correct |
31 ms |
70868 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
37 ms |
70776 KB |
Output is correct |
2 |
Correct |
31 ms |
70780 KB |
Output is correct |
3 |
Correct |
31 ms |
70744 KB |
Output is correct |
4 |
Correct |
30 ms |
70692 KB |
Output is correct |
5 |
Correct |
31 ms |
70852 KB |
Output is correct |
6 |
Correct |
30 ms |
70860 KB |
Output is correct |
7 |
Correct |
36 ms |
70860 KB |
Output is correct |
8 |
Correct |
31 ms |
70860 KB |
Output is correct |
9 |
Correct |
31 ms |
70868 KB |
Output is correct |
10 |
Correct |
37 ms |
73168 KB |
Output is correct |
11 |
Correct |
43 ms |
73080 KB |
Output is correct |
12 |
Correct |
36 ms |
73080 KB |
Output is correct |
13 |
Correct |
36 ms |
73280 KB |
Output is correct |
14 |
Correct |
36 ms |
73224 KB |
Output is correct |
15 |
Correct |
38 ms |
73688 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
931 ms |
225088 KB |
Output is correct |
2 |
Correct |
1117 ms |
230160 KB |
Output is correct |
3 |
Correct |
924 ms |
227008 KB |
Output is correct |
4 |
Correct |
777 ms |
225608 KB |
Output is correct |
5 |
Correct |
803 ms |
225600 KB |
Output is correct |
6 |
Correct |
900 ms |
227440 KB |
Output is correct |
7 |
Correct |
849 ms |
227404 KB |
Output is correct |
8 |
Correct |
1067 ms |
232064 KB |
Output is correct |
9 |
Correct |
685 ms |
228944 KB |
Output is correct |
10 |
Correct |
636 ms |
227512 KB |
Output is correct |
11 |
Correct |
667 ms |
227576 KB |
Output is correct |
12 |
Correct |
645 ms |
227392 KB |
Output is correct |
13 |
Correct |
1045 ms |
231976 KB |
Output is correct |
14 |
Correct |
1025 ms |
231988 KB |
Output is correct |
15 |
Correct |
978 ms |
231956 KB |
Output is correct |
16 |
Correct |
991 ms |
232128 KB |
Output is correct |
17 |
Correct |
785 ms |
227288 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
37 ms |
70776 KB |
Output is correct |
2 |
Correct |
31 ms |
70780 KB |
Output is correct |
3 |
Correct |
31 ms |
70744 KB |
Output is correct |
4 |
Correct |
30 ms |
70692 KB |
Output is correct |
5 |
Correct |
31 ms |
70852 KB |
Output is correct |
6 |
Correct |
30 ms |
70860 KB |
Output is correct |
7 |
Correct |
36 ms |
70860 KB |
Output is correct |
8 |
Correct |
31 ms |
70860 KB |
Output is correct |
9 |
Correct |
31 ms |
70868 KB |
Output is correct |
10 |
Correct |
37 ms |
73168 KB |
Output is correct |
11 |
Correct |
43 ms |
73080 KB |
Output is correct |
12 |
Correct |
36 ms |
73080 KB |
Output is correct |
13 |
Correct |
36 ms |
73280 KB |
Output is correct |
14 |
Correct |
36 ms |
73224 KB |
Output is correct |
15 |
Correct |
38 ms |
73688 KB |
Output is correct |
16 |
Correct |
931 ms |
225088 KB |
Output is correct |
17 |
Correct |
1117 ms |
230160 KB |
Output is correct |
18 |
Correct |
924 ms |
227008 KB |
Output is correct |
19 |
Correct |
777 ms |
225608 KB |
Output is correct |
20 |
Correct |
803 ms |
225600 KB |
Output is correct |
21 |
Correct |
900 ms |
227440 KB |
Output is correct |
22 |
Correct |
849 ms |
227404 KB |
Output is correct |
23 |
Correct |
1067 ms |
232064 KB |
Output is correct |
24 |
Correct |
685 ms |
228944 KB |
Output is correct |
25 |
Correct |
636 ms |
227512 KB |
Output is correct |
26 |
Correct |
667 ms |
227576 KB |
Output is correct |
27 |
Correct |
645 ms |
227392 KB |
Output is correct |
28 |
Correct |
1045 ms |
231976 KB |
Output is correct |
29 |
Correct |
1025 ms |
231988 KB |
Output is correct |
30 |
Correct |
978 ms |
231956 KB |
Output is correct |
31 |
Correct |
991 ms |
232128 KB |
Output is correct |
32 |
Correct |
785 ms |
227288 KB |
Output is correct |
33 |
Correct |
1276 ms |
230468 KB |
Output is correct |
34 |
Correct |
246 ms |
168540 KB |
Output is correct |
35 |
Correct |
1581 ms |
241396 KB |
Output is correct |
36 |
Correct |
1302 ms |
235104 KB |
Output is correct |
37 |
Correct |
1525 ms |
238852 KB |
Output is correct |
38 |
Correct |
1341 ms |
236636 KB |
Output is correct |
39 |
Correct |
1168 ms |
243196 KB |
Output is correct |
40 |
Correct |
1065 ms |
276188 KB |
Output is correct |
41 |
Correct |
1095 ms |
237440 KB |
Output is correct |
42 |
Correct |
788 ms |
235024 KB |
Output is correct |
43 |
Correct |
1424 ms |
258272 KB |
Output is correct |
44 |
Correct |
1356 ms |
238832 KB |
Output is correct |
45 |
Correct |
797 ms |
245052 KB |
Output is correct |
46 |
Correct |
938 ms |
243144 KB |
Output is correct |
47 |
Correct |
1085 ms |
239136 KB |
Output is correct |
48 |
Correct |
1050 ms |
238244 KB |
Output is correct |
49 |
Correct |
1035 ms |
239092 KB |
Output is correct |
50 |
Correct |
997 ms |
238200 KB |
Output is correct |
51 |
Correct |
901 ms |
276712 KB |
Output is correct |
52 |
Correct |
1018 ms |
276884 KB |
Output is correct |