#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <unordered_set>
#include <vector>
#include <utility>
#include "werewolf.h"
using namespace std;
vector<int> adj[3000]; bool r1[3000], r2[3000];
int cr, cl, n, minvs[600000] = {}, maxvs[600000] = {};
void updh(int i, int s, int e, int l, int u, int d) {
if (s > e || s > u || e < l) {
return;
}
if (s >= l && e <= u) {
minvs[i] = d; maxvs[i] = d; return;
}
updh(i*2+1, s, (s+e)/2, l, u, d); updh(i*2+2, (s+e)/2+1, e, l, u, d);
minvs[i] = min(minvs[i*2+1], minvs[i*2+2]); maxvs[i] = max(maxvs[i*2+1], maxvs[i*2+2]);
}
void updv(int i, int d) {
updh(0, 0, n-1, i, i, d);
}
int minh(int i, int s, int e, int l, int u) {
if (s > e || s > u || e < l) {
return 1000000000;
}
if (s >= l && e <= u) {
return minvs[i];
}
return min(minh(2*i+1, s, (s+e)/2, l, u), minh(2*i+2, (s+e)/2+1, e, l, u));
}
int minv(int l, int u) {
return minh(0, 0, n-1, l, u);
}
int maxh(int i, int s, int e, int l, int u) {
if (s > e || s > u || e < l) {
return -1;
}
if (s >= l && e <= u) {
return maxvs[i];
}
return max(maxh(2*i+1, s, (s+e)/2, l, u), maxh(2*i+2, (s+e)/2+1, e, l, u));
}
int maxv(int l, int u) {
return maxh(0, 0, n-1, l, u);
}
void dfs1(int i){
if (i >= cl){
r1[i] = true;
for (int a : adj[i]){
if (a >= cl && !r1[a]){
dfs1(a);
}
}
}
}
void dfs2(int i){
if (i <= cr){
r2[i] = true;
for (int a : adj[i]){
if (a <= cr && !r2[a]){
dfs2(a);
}
}
}
}
void dfs3(int i, int p, int ind){
updv(ind, i);
for (int a : adj[i]){
if (a != p){
dfs3(a, i, ind+1);
}
}
}
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; int Q = S.size(); vector<int> A(Q);
for (int i = 0; i < Q; ++i) {
A[i] = 0;
}
for (int i = 0; i < X.size(); i++){
adj[X[i]].push_back(Y[i]); adj[Y[i]].push_back(X[i]);
}
if (N == X.size() + 1 && N > 3000){
/*for (int i = 0; i < N; i++){
if (adj[i].size() == 1){
dfs3(i, -1, 0); break;
}
}*/
for (int i = 0; i < Q; i++) {
cr = R[i]; cl = L[i];
int low = S[i], high = E[i], ub = 0;
if (S[i] >= cl && E[i] <= R[i]){
continue;
}
while (true){
if (low == high){
ub = low;
}
if (low+1 == high){
ub = high;
if (minv(S[i], high) < cl){
ub = low;
}
break;
}
int mid = (low + high)/2;
if (minv(S[i], mid) < cl){
high = mid;
} else {
low = mid;
}
}
low = S[i], high = E[i]; int lb = 0;
while (true){
if (low == high){
lb = low;
}
if (low+1 == high){
lb = low;
if (maxv(low, E[i]) > cr){
lb = high;
}
break;
}
int mid = (low + high)/2;
if (maxv(mid, E[i]) > cr){
low = mid;
} else {
high = mid;
}
}
if (ub >= lb){
A[i] = 1;
}
}
} else {
for (int i = 0; i < Q; i++) {
for (int j = 0; j < N; j++){
r1[j] = false; r2[j] = false;
}
cr = R[i]; cl = L[i];
dfs1(S[i]); dfs2(E[i]);
for (int j = L[i]; j <= R[i]; j++){
if (r1[j] && r2[j]){
A[i] = 1; break;
}
}
}
}
return A;
}
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:88:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
88 | for (int i = 0; i < X.size(); i++){
| ~~^~~~~~~~~~
werewolf.cpp:91:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
91 | if (N == X.size() + 1 && N > 3000){
| ~~^~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
364 KB |
Output is correct |
2 |
Correct |
1 ms |
364 KB |
Output is correct |
3 |
Correct |
1 ms |
364 KB |
Output is correct |
4 |
Correct |
1 ms |
364 KB |
Output is correct |
5 |
Correct |
1 ms |
364 KB |
Output is correct |
6 |
Correct |
1 ms |
384 KB |
Output is correct |
7 |
Correct |
1 ms |
364 KB |
Output is correct |
8 |
Correct |
1 ms |
364 KB |
Output is correct |
9 |
Correct |
1 ms |
364 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
364 KB |
Output is correct |
2 |
Correct |
1 ms |
364 KB |
Output is correct |
3 |
Correct |
1 ms |
364 KB |
Output is correct |
4 |
Correct |
1 ms |
364 KB |
Output is correct |
5 |
Correct |
1 ms |
364 KB |
Output is correct |
6 |
Correct |
1 ms |
384 KB |
Output is correct |
7 |
Correct |
1 ms |
364 KB |
Output is correct |
8 |
Correct |
1 ms |
364 KB |
Output is correct |
9 |
Correct |
1 ms |
364 KB |
Output is correct |
10 |
Correct |
257 ms |
748 KB |
Output is correct |
11 |
Correct |
156 ms |
620 KB |
Output is correct |
12 |
Correct |
31 ms |
748 KB |
Output is correct |
13 |
Correct |
283 ms |
620 KB |
Output is correct |
14 |
Correct |
190 ms |
748 KB |
Output is correct |
15 |
Correct |
249 ms |
876 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
181 ms |
21228 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
364 KB |
Output is correct |
2 |
Correct |
1 ms |
364 KB |
Output is correct |
3 |
Correct |
1 ms |
364 KB |
Output is correct |
4 |
Correct |
1 ms |
364 KB |
Output is correct |
5 |
Correct |
1 ms |
364 KB |
Output is correct |
6 |
Correct |
1 ms |
384 KB |
Output is correct |
7 |
Correct |
1 ms |
364 KB |
Output is correct |
8 |
Correct |
1 ms |
364 KB |
Output is correct |
9 |
Correct |
1 ms |
364 KB |
Output is correct |
10 |
Correct |
257 ms |
748 KB |
Output is correct |
11 |
Correct |
156 ms |
620 KB |
Output is correct |
12 |
Correct |
31 ms |
748 KB |
Output is correct |
13 |
Correct |
283 ms |
620 KB |
Output is correct |
14 |
Correct |
190 ms |
748 KB |
Output is correct |
15 |
Correct |
249 ms |
876 KB |
Output is correct |
16 |
Runtime error |
181 ms |
21228 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
17 |
Halted |
0 ms |
0 KB |
- |