// #define LOCAL 1
#include <bits/stdc++.h>
#ifndef LOCAL
#include "werewolf.h"
#endif
using namespace std;
#define REP(i, n) for (int i = 0; i < (n); i++)
// Calculate DP
// dp[u] := True if its possible to find path S-->u s.t. nodes are all in range
// [lo,hi]
vector<bool> calc_dp(int S, vector<vector<int>>& adjList, int lo, int hi) {
const int N = adjList.size();
vector<bool> dp(N, false);
dp[S] = S >= lo && S <= hi;
queue<int> q;
q.push(S);
while (!q.empty()) {
int u = q.front();
q.pop();
if (!dp[u]) {continue;}
for (auto& v : adjList[u]) {
if (v >= lo && v <= hi && !dp[v]) {
dp[v] = true;
q.push(v);
}
}
}
return dp;
}
vector<int> check_validity(int N, vector<int> X, vector<int> Y,
vector<int> S, vector<int> E,
vector<int> L, vector<int> R) {
const int Q = L.size();
const int M = X.size();
vector<vector<int>> adjList(N);
REP(i, M) {
adjList[X[i]].push_back(Y[i]);
adjList[Y[i]].push_back(X[i]);
}
vector<int> r(Q, 0);
REP(i, Q) {
int s = S[i];
int e = E[i];
int li = L[i];
int ri = R[i];
if (max(s, e) < li) {
auto dp = calc_dp(s, adjList, 0, li-1);
r[i] = dp[e];
} else if (min(s, e) > ri) {
auto dp = calc_dp(s, adjList, ri+1, N-1);
r[i] = dp[e];
} else {
if (s > e) {swap(s, e);}
auto dp0 = calc_dp(s, adjList, 0, ri);
auto dp1 = calc_dp(e, adjList, li, N-1);
for (int u = 0; u < N; ++u) {
if (dp0[u] && dp1[u]) {r[i] = 1; break;}
}
}
}
return r;
}
#ifdef LOCAL
int main() {
int N = 6;
vector<int> X{5,1,1,3,3,5};
vector<int> Y{1,2,3,4,0,2};
vector<int> S{4,4,5};
vector<int> E{2,2,4};
vector<int> L{1,2,3};
vector<int> R{2,2,4};
auto r = check_validity(N, X, Y, S, E, L, R);
for_each(r.begin(), r.end(), [](int x) {cout << x << ' ';});
cout << '\n';
return 0;
}
#endif
| # | 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... |