제출 #1306124

#제출 시각아이디문제언어결과실행 시간메모리
1306124fafnir늑대인간 (IOI18_werewolf)C++20
0 / 100
4094 ms21500 KiB
// #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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...