#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
class RangedTree {
public:
vector<int> dat[22], U; int ty, size_;
void init(int N, vector<int>T, int typ) {
size_ = N;
for (int i = 0; i < 22; i++) dat[i].resize(N + 2, 0);
for (int i = 0; i < N; i++) dat[0][i] = T[i];
for (int i = 0; i < 21; i++) {
for (int j = 0; j < N; j++) {
if (j + (1 << i) >= N) dat[i + 1][j] = dat[i][j];
else {
if (typ == 1) dat[i + 1][j] = min(dat[i][j], dat[i][j + (1 << i)]);
if (typ == 2) dat[i + 1][j] = max(dat[i][j], dat[i][j + (1 << i)]);
}
}
}
ty = typ;
U.resize(N + 2, 0);
for (int i = 0; i < 21; i++) {
for (int j = (1 << i); j < (2 << i); j++) {
if (j < (int)U.size()) U[j] = i;
}
}
}
int query(int cl, int cr) {
cr++; if (cr > size_) cr = size_;
int lens = cr - cl;
if (ty == 1) return min(dat[U[lens]][cl], dat[U[lens]][cr - (1 << U[lens])]);
if (ty == 2) return max(dat[U[lens]][cl], dat[U[lens]][cr - (1 << U[lens])]);
return -1;
}
};
int N, M, Q, dp[5009][2], I[200009], J[200009], Order[200009]; vector<int>G[200009];
RangedTree Z[2]; bool used[200009];
pair<int, int> calc(int ty, int pos, int lim) {
if (ty == 1) {
int L1 = 0, R1 = pos + 1, M1, T1 = pos;
for (int i = 0; i < 20; i++) {
M1 = (L1 + R1) / 2;
int B = Z[0].query(M1, pos);
if (B >= lim) { R1 = M1; T1 = min(T1, M1); }
else { L1 = M1; }
}
int L2 = pos, R2 = N, M2, T2 = pos;
for (int i = 0; i < 20; i++) {
M2 = (L2 + R2) / 2;
int B = Z[0].query(pos, M2);
if (B >= lim) { L2 = M2; T2 = max(T2, M2); }
else { R2 = M2; }
}
return make_pair(T1, T2);
}
if (ty == 2) {
int L1 = 0, R1 = pos + 1, M1, T1 = pos;
for (int i = 0; i < 20; i++) {
M1 = (L1 + R1) / 2;
int B = Z[1].query(M1, pos); //cout << "max [" << M1 << ", " << pos << "] = " << B << endl;
if (B <= lim) { R1 = M1; T1 = min(T1, M1); }
else { L1 = M1; }
}
int L2 = pos, R2 = N, M2, T2 = pos;
for (int i = 0; i < 20; i++) {
M2 = (L2 + R2) / 2;
int B = Z[1].query(pos, M2); //cout << "max [" << pos << ", " << M2 << "] = " << B << endl;
if (B <= lim) { L2 = M2; T2 = max(T2, M2); }
else { R2 = M2; }
}
return make_pair(T1, T2);
}
}
vector<int> check_validity(int NN, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) {
N = NN; M = X.size(); Q = S.size();
for (int i = 0; i < M; i++) { G[X[i]].push_back(Y[i]); G[Y[i]].push_back(X[i]); }
if (!(N <= 3000 && M <= 6000 && Q <= 3000)){
// For subtask 3
int cx = -1; for (int i = 0; i < N; i++) { if (G[i].size() == 1) cx = i; }
int cntv = 0; used[cx] = true; I[cntv] = cx; cntv++;
while (true) {
int cp = -1; for (int i = 0; i < G[cx].size(); i++) { if (used[G[cx][i]]==false) cp=G[cx][i]; }
if (cp == -1) break;
I[cntv] = cp; cx = cp; cntv++; used[cx]=true;
}
vector<int> V; for (int i = 0; i < cntv; i++) { V.push_back(I[i]); Order[I[i]] = i; }
Z[0].init(N, V, 1);
Z[1].init(N, V, 2);
vector<int>ans;
for (int i = 0; i < Q; i++) {
//cout << "Start = " << Order[S[i]] << ", Goal = " << Order[E[i]] << endl;
pair<int, int> A1 = calc(1, Order[S[i]], L[i]);
pair<int, int> A2 = calc(2, Order[E[i]], R[i]);
pair<int, int> A3 = make_pair(max(A1.first, A2.first), min(A1.second, A2.second));
//cout << "Human = [" << A1.first << ", " << A1.second << "] , Wolf = [" << A2.first << ", " << A2.second << "]" << endl;
if (A3.first <= A3.second) ans.push_back(1);
else ans.push_back(0);
}
return ans;
}
else {
// For subtask 1, 2
vector<int>ans;
for (int i = 0; i < Q; i++) {
for (int j = 0; j <= N; j++) { dp[j][0] = 0; dp[j][1] = 0; }
dp[S[i]][0] = 1; queue<pair<int, int>> que; que.push(make_pair(S[i], 0));
while(!que.empty()){
int pos1 = que.front().first, pos2 = que.front().second; que.pop();
if (pos2 == 0 && dp[pos1][1] == 0 && L[i] <= pos1 && pos1 <= R[i]) {
dp[pos1][1] = 1;
que.push(make_pair(pos1, 1));
}
for (int j = 0; j < G[pos1].size(); j++) {
int to = G[pos1][j];
if (pos2 == 0 && to < L[i]) continue;
if (pos2 == 1 && R[i] < to) continue;
if (dp[to][pos2] == 1) continue;
dp[to][pos2] = 1;
que.push(make_pair(to, pos2));
}
}
ans.push_back(dp[E[i]][1]);
}
return ans;
}
}
Compilation message
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:90:35: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
int cp = -1; for (int i = 0; i < G[cx].size(); i++) { if (used[G[cx][i]]==false) cp=G[cx][i]; }
~~^~~~~~~~~~~~~~
werewolf.cpp:129:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int j = 0; j < G[pos1].size(); j++) {
~~^~~~~~~~~~~~~~~~
werewolf.cpp: In function 'std::pair<int, int> calc(int, int, int)':
werewolf.cpp:78:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
5120 KB |
Output is correct |
2 |
Correct |
8 ms |
5120 KB |
Output is correct |
3 |
Correct |
8 ms |
4992 KB |
Output is correct |
4 |
Correct |
7 ms |
4992 KB |
Output is correct |
5 |
Correct |
8 ms |
4992 KB |
Output is correct |
6 |
Correct |
6 ms |
4992 KB |
Output is correct |
7 |
Correct |
6 ms |
4992 KB |
Output is correct |
8 |
Correct |
6 ms |
4992 KB |
Output is correct |
9 |
Correct |
7 ms |
5120 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
5120 KB |
Output is correct |
2 |
Correct |
8 ms |
5120 KB |
Output is correct |
3 |
Correct |
8 ms |
4992 KB |
Output is correct |
4 |
Correct |
7 ms |
4992 KB |
Output is correct |
5 |
Correct |
8 ms |
4992 KB |
Output is correct |
6 |
Correct |
6 ms |
4992 KB |
Output is correct |
7 |
Correct |
6 ms |
4992 KB |
Output is correct |
8 |
Correct |
6 ms |
4992 KB |
Output is correct |
9 |
Correct |
7 ms |
5120 KB |
Output is correct |
10 |
Correct |
446 ms |
5388 KB |
Output is correct |
11 |
Correct |
310 ms |
5496 KB |
Output is correct |
12 |
Correct |
32 ms |
5368 KB |
Output is correct |
13 |
Correct |
390 ms |
5724 KB |
Output is correct |
14 |
Correct |
248 ms |
5368 KB |
Output is correct |
15 |
Correct |
292 ms |
5376 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1306 ms |
61576 KB |
Output is correct |
2 |
Correct |
1226 ms |
69780 KB |
Output is correct |
3 |
Correct |
1022 ms |
69940 KB |
Output is correct |
4 |
Correct |
1351 ms |
69980 KB |
Output is correct |
5 |
Correct |
1038 ms |
69944 KB |
Output is correct |
6 |
Correct |
1130 ms |
69948 KB |
Output is correct |
7 |
Correct |
1210 ms |
69896 KB |
Output is correct |
8 |
Correct |
945 ms |
69940 KB |
Output is correct |
9 |
Correct |
579 ms |
69788 KB |
Output is correct |
10 |
Correct |
717 ms |
69924 KB |
Output is correct |
11 |
Correct |
802 ms |
69912 KB |
Output is correct |
12 |
Correct |
656 ms |
70036 KB |
Output is correct |
13 |
Correct |
1185 ms |
70012 KB |
Output is correct |
14 |
Correct |
1086 ms |
69980 KB |
Output is correct |
15 |
Correct |
1008 ms |
69980 KB |
Output is correct |
16 |
Correct |
1144 ms |
69912 KB |
Output is correct |
17 |
Correct |
1109 ms |
69980 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
5120 KB |
Output is correct |
2 |
Correct |
8 ms |
5120 KB |
Output is correct |
3 |
Correct |
8 ms |
4992 KB |
Output is correct |
4 |
Correct |
7 ms |
4992 KB |
Output is correct |
5 |
Correct |
8 ms |
4992 KB |
Output is correct |
6 |
Correct |
6 ms |
4992 KB |
Output is correct |
7 |
Correct |
6 ms |
4992 KB |
Output is correct |
8 |
Correct |
6 ms |
4992 KB |
Output is correct |
9 |
Correct |
7 ms |
5120 KB |
Output is correct |
10 |
Correct |
446 ms |
5388 KB |
Output is correct |
11 |
Correct |
310 ms |
5496 KB |
Output is correct |
12 |
Correct |
32 ms |
5368 KB |
Output is correct |
13 |
Correct |
390 ms |
5724 KB |
Output is correct |
14 |
Correct |
248 ms |
5368 KB |
Output is correct |
15 |
Correct |
292 ms |
5376 KB |
Output is correct |
16 |
Correct |
1306 ms |
61576 KB |
Output is correct |
17 |
Correct |
1226 ms |
69780 KB |
Output is correct |
18 |
Correct |
1022 ms |
69940 KB |
Output is correct |
19 |
Correct |
1351 ms |
69980 KB |
Output is correct |
20 |
Correct |
1038 ms |
69944 KB |
Output is correct |
21 |
Correct |
1130 ms |
69948 KB |
Output is correct |
22 |
Correct |
1210 ms |
69896 KB |
Output is correct |
23 |
Correct |
945 ms |
69940 KB |
Output is correct |
24 |
Correct |
579 ms |
69788 KB |
Output is correct |
25 |
Correct |
717 ms |
69924 KB |
Output is correct |
26 |
Correct |
802 ms |
69912 KB |
Output is correct |
27 |
Correct |
656 ms |
70036 KB |
Output is correct |
28 |
Correct |
1185 ms |
70012 KB |
Output is correct |
29 |
Correct |
1086 ms |
69980 KB |
Output is correct |
30 |
Correct |
1008 ms |
69980 KB |
Output is correct |
31 |
Correct |
1144 ms |
69912 KB |
Output is correct |
32 |
Correct |
1109 ms |
69980 KB |
Output is correct |
33 |
Runtime error |
358 ms |
84772 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
34 |
Halted |
0 ms |
0 KB |
- |