Submission #1104139

#TimeUsernameProblemLanguageResultExecution timeMemory
1104139dubabubaWerewolf (IOI18_werewolf)C++14
0 / 100
224 ms40964 KiB
#include "werewolf.h" #include <bits/stdc++.h> using namespace std; template<typename T, typename U> void miner(T &MIN, U CMP) { if(MIN > CMP) MIN = CMP; } template<typename T, typename U> void maxer(T &MAX, U CMP) { if(MAX < CMP) MAX = CMP; } #define ff first #define ss second #define MP make_pair typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<pii> vp; const int inf = 1e9 + 10; const int mxn = 2e5 + 10; const int MXN = 4e5 + 10; int LQ[mxn], RQ[mxn]; int mx[MXN], mn[MXN]; int n, m, q; int parent(int u, vi &par) { if(par[u] < 0) return u; return par[u] = parent(par[u], par); } vi check_validity(int N, vi X, vi Y, vi S, vi E, vi L, vi R) { n = N; m = X.size(); q = S.size(); vector<pair<pii, int>> LE, RE; for(int i = 0; i < m; i++) { int u = X[i]; int v = Y[i]; if(u > v) swap(u, v); LE.push_back(MP(MP(u, inf), v)); RE.push_back(MP(MP(v, -inf), u)); } for(int i = 0; i < q; i++) { int l = L[i], r = R[i]; int s = S[i], e = E[i]; LE.push_back(MP(MP(l, i), s)); RE.push_back(MP(MP(r, i), e)); } sort(LE.begin(), LE.end(), [&](auto L, auto R) { return L > R; }); sort(RE.begin(), RE.end()); int cur = n; vi L_anc(2 * n, -1); for(int i = 0; i < n; i++) mn[i] = i; for(auto e : LE) { int id = e.ff.ss; int u = parent(e.ff.ff, L_anc); int v = parent(e.ss, L_anc); if(id != inf) { LQ[id] = mn[v]; continue; } if(u == v) continue; L_anc[u] = cur; L_anc[v] = cur; mn[cur] = e.ff.ff; miner(mn[cur], mn[u]); miner(mn[cur], mn[v]); // cout << e.ff.ff << ' ' << e.ss << " -> " // << u << ' ' << v << " = " // << cur << ": " << mn[cur] << endl; cur++; } mn[cur] = -inf; assert(cur == 2 * n - 1); // cout << "----------------\n"; cur = n; vi R_anc(2 * n, -1); for(int i = 0; i < n; i++) mx[i] = i; for(auto e : RE) { int id = e.ff.ss; int u = parent(e.ff.ff, R_anc); int v = parent(e.ss, R_anc); if(id != -inf) { RQ[id] = mx[v]; continue; } if(u == v) continue; R_anc[u] = cur; R_anc[v] = cur; mx[cur] = e.ff.ff; maxer(mx[cur], mx[u]); maxer(mx[cur], mx[v]); // cout << e.ff.ff << ' ' << e.ss << " -> " // << u << ' ' << v << " = " // << cur << ": " << mx[cur] << endl; cur++; } mx[cur] = inf; assert(cur == 2 * n - 1); vi par(n, -1); for(int i = 0; i < m; i++) { int u = parent(X[i], par); int v = parent(Y[i], par); if(u == v) continue; par[u] += par[v]; par[v] = u; } vector<int> ans; for(int i = 0; i < q; i++) { int l = L[i], r = R[i]; if(RQ[i] < l || r < LQ[i]) { ans.push_back(0); continue; } int SL = parent(LQ[i], par); int SR = parent(RQ[i], par); if(SL == SR) ans.push_back(1); else ans.push_back(0); } return ans; } /* 6 6 3 5 1 1 2 1 3 3 4 3 0 5 2 4 2 1 2 4 2 2 2 5 4 3 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...