#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
struct dsu{
vector<int> p;
vector<int> sz;
dsu(int n){
p.resize(n);
iota(p.begin(), p.end(), 0);
sz.resize(n, 1);
}
int find(int v){
return p[v] == v ? v : p[v] = find(p[v]);
}
void merge(int a, int b){
a = find(a); b = find(b);
if(a==b) return;
if(sz[a] < sz[b]) swap(a, b);
p[b] = a;
sz[a] += sz[b];
return;
}
};
std::vector<int> check_validity(int N, std::vector<int> X, std::vector<int> Y,
std::vector<int> S, std::vector<int> E,
std::vector<int> L, std::vector<int> R) {
vector<dsu> l(N, dsu(N));
vector<dsu> r(N, dsu(N));
vector<vector<int>> adj(N);
for(int i = 0; i<X.size(); i++){
adj[X[i]].push_back(Y[i]);
adj[Y[i]].push_back(X[i]);
}
for(int i = N-1; i>=0; i--){
if(i<N-1) l[i] = l[i+1];
for(int u: adj[i]){
if(u>i) l[i].merge(i, u);
}
}
for(int i= 0; i<N; i++){
if(i>0) r[i] = r[i-1];
for(int u: adj[i]){
if(u<i) r[i].merge(i, u);
}
}
vector<int> sol(S.size(), 0);
for(int i = 0; i<S.size(); i++){
for(int j = L[i]; j<=R[i]; j++){
if(l[L[i]].find(j) == l[L[i]].find(S[i]) && r[R[i]].find(j) == r[R[i]].find(E[i])) sol[i] = 1;
}
}
return sol;
}
# | 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... |