This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
const int MAXN = (int) 4e5 + 5;
int n;
int t[MAXN];
void upd(int v, int val){
v++;
for(; v < MAXN; v += (v&-v))
t[v] += val;
}
int gt(int l, int r){
r++;
int res = 0;
for(; r; r -= (r&-r)) res += t[r];
for(; l; l -= (l&-l)) res -= t[l];
return res;
}
vector<pair<int, int>> Qs[MAXN];
vector<int> A;
struct ali{
int cev[MAXN], tin[MAXN], tout[MAXN], sz[MAXN];
int cur = 1;
int par[MAXN];
vector<int> adj[MAXN];
void ini(){
for(int i = 0; i < n; i++){
sz[i] = 1;
par[i] = i;
}
}
int find_set(int v){
if(par[v] == v) return v;
return par[v] = find_set(par[v]);
}
void merge(int a, int b, bool cur){
a = find_set(a);
b = find_set(b);
if(a == b) return;
if(cur){
if(a < b){
swap(a, b);
}
sz[a] += sz[b];
par[b] = a;
adj[a].push_back(b);
}else{
if(a > b) swap(a, b);
sz[a] += sz[b];
par[b] = a;
adj[a].push_back(b);
}
}
void dfs(int v){
tin[v] = cur++;
cev[cur - 1] = v;
for(int j: adj[v])
dfs(j);
tout[v] = cur - 1;
}
void dfs2(int v, bool keep, ali &s){
int hv = -1;
for(int j: adj[v]){
if(hv == -1 || sz[j] > sz[hv])
hv = j;
}
for(int j: adj[v]){
if(j != hv)
dfs2(j, 0, s);
}
if(hv != -1)
dfs2(hv, 1, s);
for(int j: adj[v]){
if(j != hv){
for(int i = tin[j]; i <= tout[j]; i++){
upd(s.tin[cev[i]], 1);
}
}
}
upd(s.tin[v], 1);
for(auto j: Qs[v]){
A[j.second] = (gt(s.tin[j.first], s.tout[j.first]) > 0);
}
if(keep == 0){
for(int i = tin[v]; i <= tout[v]; i++)
upd(s.tin[cev[i]], -1);
}
}
} st1, st2;
vi check_validity(int N, vi X, vi Y, vi S, vi E, vi L, vi R) {
n = N;
int M = X.size(), Q = S.size();
st1.ini();
st2.ini();
A.resize(Q);
vector<int> esi;
for(int i = 0; i < M; i++){
esi.push_back(i);
}
sort(esi.begin(), esi.end(), [&X, &Y](int a, int b){
return min(X[a], Y[a]) > min(X[b], Y[b]);
});
int curM = N;
st1.ini(); st2.ini();
for(int i = 0; i < M; i++){
st1.merge(X[esi[i]], Y[esi[i]], 0);
}
sort(esi.begin(), esi.end(), [&X, &Y](int a, int b){
return max(X[a], Y[a]) < max(X[b], Y[b]);
});
for(int i = 0; i < M; i++){
st2.merge(X[esi[i]], Y[esi[i]], 1);
}
st1.dfs(0);
st2.dfs(n - 1);
for(int i = 0; i < Q; i++){
if(st1.tin[S[i]] < st1.tin[L[i]] || st1.tin[S[i]] > st1.tout[L[i]]){
L[i] = S[i];
}
if(st2.tin[E[i]] < st2.tin[R[i]] || st2.tin[E[i]] > st2.tout[R[i]]){
R[i] = E[i];
}
Qs[L[i]].push_back({R[i], i});
}
st1.dfs2(0, 0, st2);
return A;
}
Compilation message (stderr)
werewolf.cpp: In function 'vi check_validity(int, vi, vi, vi, vi, vi, vi)':
werewolf.cpp:129:9: warning: unused variable 'curM' [-Wunused-variable]
129 | int curM = N;
| ^~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |