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 <iostream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <cstring>
#include <chrono>
#include <vector>
#include <map>
#include <random>
#include <set>
#include <algorithm>
#include <math.h>
#include <cstdio>
#include <stdio.h>
#include "werewolf.h"
#include <queue>
#include <bitset>
#include <cstdlib>
#include <deque>
#include <cassert>
#include <stack>
using namespace std;
#define mp make_pair
#define f first
#define se second
#define pb push_back
#define ppb pop_back
#define emb emplace_back
#define ll long long
#define ull unsigned long long
#define cntbit(x) __builtin_popcount(x)
#define endl '\n'
#define uset unordered_set
#define umap unordered_map
#define pii pair<int, int>
#define ld long double
#define pll pair<long long, long long>
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template <typename T> inline T range(T l, T r) {
return uniform_int_distribution<T>(l, r)(rng);
}
inline void setin(string s) {
freopen(s.c_str(), "r", stdin);
}
inline void setout(string s) {
freopen(s.c_str(), "w", stdout);
}
template <typename T> void Min(T &a, T b) {
a = min(a, b);
}
template <typename T> void Max(T &a, T b) {
a = max(a, b);
}
const int inf = 2e9;
const int mod = 998244353;
const int N = 4e5 + 15;
int n, q;
vector <int> g[N];
struct dsu {
int p[N], sz[N];
dsu() {
for(int i = 0; i < N; ++i)
p[i] = i, sz[i] = 1;
}
int find(int v) {
if(v == p[v])
return v;
return p[v] = find(p[v]);
}
void unio(int a, int b) {
a = find(a);
b = find(b);
if(a != b) {
if(sz[a] < sz[b])
swap(a, b);
p[b] = a;
sz[a] += sz[b];
}
}
} dsu;
struct query {
int l, r, s, e, ind;
bool operator < (const query &rhs) const {
return r < rhs.r;
}
} qs[N];
inline void add(int v) {
for(int to : g[v])
if(to < v)
dsu.unio(to, v);
}
bool used[N];
bool dfs(int v, int l, int need) {
used[v] = true;
if(dsu.find(v) == need)
return true;
for(int to : g[v])
if(to >= l && !used[to]) {
if(dfs(to, l, need))
return true;
}
return false;
}
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;
q = S.size();
vector<int> ans(q, 0);
for(int i = 0; i < X.size(); ++i)
g[X[i]].pb(Y[i]), g[Y[i]].pb(X[i]);
for(int i = 0; i < q; ++i)
qs[i] = {L[i], R[i], S[i], E[i], i};
sort(qs, qs + q);
for(int i = 0, ptr = 0; i < q; ++i) {
while(ptr < n && ptr <= qs[i].r)
add(ptr++);
memset(used, 0, sizeof(bool) * n);
ans[qs[i].ind] = dfs(qs[i].s, qs[i].l, dsu.find(qs[i].e));
}
return ans;
}
Compilation message (stderr)
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:124:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < X.size(); ++i)
~~^~~~~~~~~~
# | 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... |