#include "werewolf.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
using vi = vector<int>;
using ii = pair<int, int>;
using ull = unsigned long long;
const int BUCKET = 62;
struct DSU {
vi e, mi, ma;
DSU(int n) : e(n, -1), mi(n), ma(n) {
iota(mi.begin(), mi.end(), 0);
iota(ma.begin(), ma.end(), 0);
}
int repr(int u) {
while(e[u] >= 0) u = e[u];
return u;
}
bool join(int u, int v) {
u = repr(u);
v = repr(v);
if(u == v) return false;
if(e[u] >= e[v]) swap(u, v);
mi[u] = min(mi[u], mi[v]);
ma[u] = max(ma[u], ma[v]);
e[u] += e[v];
e[v] = u;
return true;
}
bool same(int u, int v) {
return repr(u) == repr(v);
}
ii seg(int u) {
u = repr(u);
return make_pair(mi[u], ma[u]);
}
};
struct BinLift {
int n;
vector<vi> A;
BinLift(vi V) {
n = int(V.size());
A.push_back(V);
for(int k = 1; (1 << k) <= n; ++k) {
A.push_back(A.back());
for(int i = 0; i < n; ++i)
if(A[k - 1][i] < 0 || A[k - 1][i] >= n);
else A[k][i] = A[k - 1][A[k - 1][i]];
}
}
int lift(int u, int k) {
return A[k][u];
}
};
vi check_validity(int n, vi X, vi Y, vi S, vi E, vi L, vi R) {
int q = (int)S.size(), m = (int)X.size();
vector<vi> Lg(n);
for(int i = 0; i < m; ++i) {
Lg[X[i]].push_back(Y[i]);
Lg[Y[i]].push_back(X[i]);
}
DSU St(n);
vi GEpar(n, n), GSpar(n, -1);
vector<vi> GE(n), GS(n);
for(int i = 0; i < n; ++i) {
for(auto it : Lg[i])
if(it < i) {
auto [mi, ma] = St.seg(it);
if(St.join(it, i)) {
GE[i].push_back(ma);
GEpar[ma] = i;
}
}
}
DSU Dr(n);
for(int i = n - 1; i >= 0; --i) {
for(auto it : Lg[i]) {
if(it > i) {
auto [mi, ma] = Dr.seg(it);
if(Dr.join(it, i)) {
GS[i].push_back(mi);
GSpar[mi] = i;
}
}
}
}
vector<vi> G(n);
for(int i = 0; i < n; ++i) {
copy(GS[i].begin(), GS[i].end(), back_inserter(G[i]));
for(auto it : GE[i])
G[it].push_back(i);
}
BinLift BLS(GSpar), BLE(GEpar);
auto reprS = [&](int u, int lim) {
for(int k = int(BLS.A.size()) - 1; k >= 0; --k)
if(BLS.lift(u, k) >= lim) u = BLS.lift(u, k);
return u;
};
auto reprE = [&](int u, int lim) {
for(int k = int(BLE.A.size()) - 1; k >= 0; --k)
if(BLE.lift(u, k) <= lim) u = BLE.lift(u, k);
return u;
};
for(int nr = 0; nr < q; ++nr) {
S[nr] = reprS(S[nr], L[nr]);
E[nr] = reprE(E[nr], R[nr]);
}
vi viz1(n, 0), viz2;
function<void(int)> dfs1 = [&](int u) {
if(viz1[u]) return;
viz1[u] = 1;
for(auto it : GE[u]) dfs1(it);
};
function<void(int)> dfs2 = [&](int u) {
if(viz2[u]) return;
viz2[u] = 1;
for(auto it : GS[u]) dfs2(it);
};
auto reach1 = [&](int s) {
viz1.assign(n, 0);
dfs1(s);
};
auto reach2 = [&](int s) {
viz2.assign(n, 0);
dfs2(s);
};
vi Re(q, 0);
for(int i = 0; i < q; ++i) {
reach1(E[i]);
reach2(S[i]);
for(int j = 0; j < n; ++j)
if(viz1[j] && viz2[j]) Re[i] = 1;
}
// vector<ull> Val(n, 0);
// for(int id = 0; id <= (q - 1) / BUCKET; ++id) {
// int st = id * BUCKET, dr = st + BUCKET;
// dr = min(dr, q);
// for(int i = 0; i < n; ++i) Val[i] = 0;
// for(int i = st; i < dr; ++i) {
// Val[E[i]] |= (1ull << (i - st));
// }
// for(int i = n - 1; i >= 0; --i) {
// for(auto it : G[i]) Val[i] |= Val[it];
// }
// for(int i = st; i < dr; ++i) {
// Re[i] = !!(Val[S[i]] & (1ull << (i - st)));
// }
// }
return Re;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
348 KB |
Output is correct |
5 |
Correct |
1 ms |
348 KB |
Output is correct |
6 |
Correct |
1 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
604 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
1 ms |
348 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
348 KB |
Output is correct |
5 |
Correct |
1 ms |
348 KB |
Output is correct |
6 |
Correct |
1 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
604 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
1 ms |
348 KB |
Output is correct |
10 |
Correct |
92 ms |
1628 KB |
Output is correct |
11 |
Correct |
75 ms |
1712 KB |
Output is correct |
12 |
Correct |
23 ms |
1884 KB |
Output is correct |
13 |
Correct |
89 ms |
1892 KB |
Output is correct |
14 |
Correct |
64 ms |
1880 KB |
Output is correct |
15 |
Correct |
74 ms |
1824 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
4074 ms |
90688 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
1 ms |
348 KB |
Output is correct |
5 |
Correct |
1 ms |
348 KB |
Output is correct |
6 |
Correct |
1 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
604 KB |
Output is correct |
8 |
Correct |
0 ms |
348 KB |
Output is correct |
9 |
Correct |
1 ms |
348 KB |
Output is correct |
10 |
Correct |
92 ms |
1628 KB |
Output is correct |
11 |
Correct |
75 ms |
1712 KB |
Output is correct |
12 |
Correct |
23 ms |
1884 KB |
Output is correct |
13 |
Correct |
89 ms |
1892 KB |
Output is correct |
14 |
Correct |
64 ms |
1880 KB |
Output is correct |
15 |
Correct |
74 ms |
1824 KB |
Output is correct |
16 |
Execution timed out |
4074 ms |
90688 KB |
Time limit exceeded |
17 |
Halted |
0 ms |
0 KB |
- |