#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define all(x) x.begin(), x.end()
#define allr(x) x.rbegin(), x.rend()
#define mp make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MAXN = 2e5+10;
const int INF = 0x3f3f3f3f;
int pai[2][MAXN], peso[2][MAXN];
int find(int tipo, int x){ return (pai[tipo][x]==x ? x : pai[tipo][x]=find(tipo, pai[tipo][x])); }
void join(int tipo, int a, int b){
a=find(tipo, a);
b=find(tipo, b);
if(a==b) return;
if(peso[tipo][a]>peso[tipo][b]) swap(a, b);
pai[tipo][a]=b;
peso[tipo][b]=max(peso[tipo][b], peso[tipo][a]+1);
}
int conv[MAXN], rev[MAXN];
vector<int> adj[MAXN];
void dfs(int ver, int val){
conv[val]=ver;
rev[ver]=val;
for(auto u : adj[ver]){
if(rev[u]!=-1) continue;
dfs(u, val+1);
}
}
int st[2][20][MAXN], lg[MAXN];
void build(int n){
lg[0]=lg[1]=0;
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int i=0;i<n;i++)
st[0][0][i]=st[1][0][i]=conv[i];
for(int i=1;i<=18;i++)
for(int j=0;j<n;j++)
st[0][i][j]=min(st[0][i-1][j], st[0][i-1][min(j+(1<<(i-1)), n)]);
for(int i=1;i<=18;i++)
for(int j=0;j<n;j++)
st[1][i][j]=max(st[1][i-1][j], st[1][i-1][min(j+(1<<(i-1)), n)]);
}
int getMx(int l, int r){
int curr=lg[r-l+1];
return max(st[1][curr][l], st[1][curr][r-(1<<curr)+1]);
}
int getMn(int l, int r){
int curr=lg[r-l+1];
return min(st[0][curr][l], st[0][curr][r-(1<<curr)+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) {
int m=(int)X.size(), q=(int)L.size();
vector<int> ans(q);
if(N<=3000 && m<=6000 && q<=3000){
for(int i=0;i<q;i++){
for(int j=0;j<N;j++){
pai[0][j]=pai[1][j]=j;
peso[0][j]=peso[1][j]=0;
}
for(int j=0;j<m;j++){
if(max(X[j], Y[j])<=R[i]) join(1, X[j], Y[j]);
if(min(X[j], Y[j])>=L[i]) join(0, X[j], Y[j]);
}
ans[i]=0;
for(int j=0;j<N;j++){
if(find(0, S[i])==find(0, j) && find(1, E[i])==find(1, j)){
ans[i]=1;
break;
}
}
}
}
else{
memset(rev, -1, sizeof rev);
for(int i=0;i<m;i++){
adj[X[i]].pb(Y[i]);
adj[Y[i]].pb(X[i]);
}
for(int i=0;i<N;i++){
if((int)adj[i].size()==1){
dfs(i, 0);
break;
}
}
build(N);
for(int i=0;i<q;i++){
int ini=rev[S[i]], fim=rev[E[i]];
if(ini==fim) ans[i]=1;
else if(ini<fim){
int lastH=-1;
if(getMx(ini, fim)>R[i]){
int low=ini, high=fim;
while(low<=high){
int mid=(low+high)>>1;
if(getMx(mid, fim)>R[i]){
lastH=mid;
low=mid+1;
}
else high=mid-1;
}
}
int lastW=INF;
if(getMn(ini, fim)<L[i]){
int low=ini, high=fim;
while(low<=high){
int mid=(low+high)>>1;
if(getMn(ini, mid)<L[i]){
lastW=mid;
high=mid-1;
}
else low=mid+1;
}
}
if(lastH>lastW || lastW==lastH+1) ans[i]=0;
else ans[i]=1;
}
else{
int lastH=INF;
if(getMx(fim, ini)>R[i]){
int low=fim, high=ini;
while(low<=high){
int mid=(low+high)>>1;
if(getMx(fim, mid)>R[i]){
lastH=mid;
high=mid-1;
}
else low=mid+1;
}
}
int lastW=-1;
if(getMn(fim, ini)<L[i]){
int low=fim, high=ini;
while(low<=high){
int mid=(low+high)>>1;
if(getMn(mid, ini)<L[i]){
lastW=mid;
low=mid+1;
}
else high=mid-1;
}
}
if(lastH<lastW || lastW==lastH-1) ans[i]=0;
else ans[i]=1;
}
}
}
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10584 KB |
Output is correct |
2 |
Correct |
2 ms |
10584 KB |
Output is correct |
3 |
Correct |
2 ms |
10588 KB |
Output is correct |
4 |
Correct |
1 ms |
10588 KB |
Output is correct |
5 |
Correct |
1 ms |
10588 KB |
Output is correct |
6 |
Correct |
2 ms |
10588 KB |
Output is correct |
7 |
Correct |
1 ms |
10588 KB |
Output is correct |
8 |
Correct |
2 ms |
10588 KB |
Output is correct |
9 |
Correct |
1 ms |
10588 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10584 KB |
Output is correct |
2 |
Correct |
2 ms |
10584 KB |
Output is correct |
3 |
Correct |
2 ms |
10588 KB |
Output is correct |
4 |
Correct |
1 ms |
10588 KB |
Output is correct |
5 |
Correct |
1 ms |
10588 KB |
Output is correct |
6 |
Correct |
2 ms |
10588 KB |
Output is correct |
7 |
Correct |
1 ms |
10588 KB |
Output is correct |
8 |
Correct |
2 ms |
10588 KB |
Output is correct |
9 |
Correct |
1 ms |
10588 KB |
Output is correct |
10 |
Correct |
298 ms |
10844 KB |
Output is correct |
11 |
Correct |
259 ms |
10840 KB |
Output is correct |
12 |
Correct |
314 ms |
10840 KB |
Output is correct |
13 |
Correct |
272 ms |
10848 KB |
Output is correct |
14 |
Correct |
222 ms |
10844 KB |
Output is correct |
15 |
Correct |
425 ms |
10872 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
261 ms |
65620 KB |
Output is correct |
2 |
Correct |
192 ms |
69644 KB |
Output is correct |
3 |
Correct |
195 ms |
69712 KB |
Output is correct |
4 |
Correct |
238 ms |
69712 KB |
Output is correct |
5 |
Correct |
210 ms |
69624 KB |
Output is correct |
6 |
Correct |
221 ms |
69712 KB |
Output is correct |
7 |
Correct |
252 ms |
69896 KB |
Output is correct |
8 |
Correct |
175 ms |
69600 KB |
Output is correct |
9 |
Correct |
167 ms |
69652 KB |
Output is correct |
10 |
Correct |
167 ms |
69672 KB |
Output is correct |
11 |
Correct |
170 ms |
69712 KB |
Output is correct |
12 |
Correct |
179 ms |
69924 KB |
Output is correct |
13 |
Correct |
231 ms |
69716 KB |
Output is correct |
14 |
Correct |
220 ms |
69648 KB |
Output is correct |
15 |
Correct |
214 ms |
69716 KB |
Output is correct |
16 |
Correct |
217 ms |
69712 KB |
Output is correct |
17 |
Correct |
271 ms |
69668 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
10584 KB |
Output is correct |
2 |
Correct |
2 ms |
10584 KB |
Output is correct |
3 |
Correct |
2 ms |
10588 KB |
Output is correct |
4 |
Correct |
1 ms |
10588 KB |
Output is correct |
5 |
Correct |
1 ms |
10588 KB |
Output is correct |
6 |
Correct |
2 ms |
10588 KB |
Output is correct |
7 |
Correct |
1 ms |
10588 KB |
Output is correct |
8 |
Correct |
2 ms |
10588 KB |
Output is correct |
9 |
Correct |
1 ms |
10588 KB |
Output is correct |
10 |
Correct |
298 ms |
10844 KB |
Output is correct |
11 |
Correct |
259 ms |
10840 KB |
Output is correct |
12 |
Correct |
314 ms |
10840 KB |
Output is correct |
13 |
Correct |
272 ms |
10848 KB |
Output is correct |
14 |
Correct |
222 ms |
10844 KB |
Output is correct |
15 |
Correct |
425 ms |
10872 KB |
Output is correct |
16 |
Correct |
261 ms |
65620 KB |
Output is correct |
17 |
Correct |
192 ms |
69644 KB |
Output is correct |
18 |
Correct |
195 ms |
69712 KB |
Output is correct |
19 |
Correct |
238 ms |
69712 KB |
Output is correct |
20 |
Correct |
210 ms |
69624 KB |
Output is correct |
21 |
Correct |
221 ms |
69712 KB |
Output is correct |
22 |
Correct |
252 ms |
69896 KB |
Output is correct |
23 |
Correct |
175 ms |
69600 KB |
Output is correct |
24 |
Correct |
167 ms |
69652 KB |
Output is correct |
25 |
Correct |
167 ms |
69672 KB |
Output is correct |
26 |
Correct |
170 ms |
69712 KB |
Output is correct |
27 |
Correct |
179 ms |
69924 KB |
Output is correct |
28 |
Correct |
231 ms |
69716 KB |
Output is correct |
29 |
Correct |
220 ms |
69648 KB |
Output is correct |
30 |
Correct |
214 ms |
69716 KB |
Output is correct |
31 |
Correct |
217 ms |
69712 KB |
Output is correct |
32 |
Correct |
271 ms |
69668 KB |
Output is correct |
33 |
Incorrect |
144 ms |
60452 KB |
Output isn't correct |
34 |
Halted |
0 ms |
0 KB |
- |