Submission #419953

#TimeUsernameProblemLanguageResultExecution timeMemory
419953AntekbWerewolf (IOI18_werewolf)C++14
100 / 100
650 ms79100 KiB
#include "werewolf.h" #include<bits/stdc++.h> #define st first #define nd second #define pb(x) push_back(x) #define mp(x, y) make_pair(x, y) using namespace std; typedef vector<int> vi; const int N=(1<<18); int r[N]; vector<int> edg[N]; vector<int> E[N], E2[N]; int find(int v){ if(r[v]==v)return v; return r[v]=find(r[v]); } int wsk2=0; int pre[N], post[N]; void dfs(int v){ pre[v]=wsk2++; for(int u:E[v]){ dfs(u); } post[v]=wsk2; } int tab[N+N]; void add(int i){ for(i+=N; i>0; i>>=1){ tab[i]++; } } int sum(int l, int r){ int ans=0; for(l+=N, r+=N; l<r; l>>=1, r>>=1){ if(l&1)ans+=tab[l++]; if(r&1)ans+=tab[--r]; } return ans; } vector<int> A; vector<pair<int, int> > quer[N]; void dfs2(int v){ for(auto i:quer[v]){ A[i.nd]=-sum(pre[i.st], post[i.st]); } add(pre[v]); for(int u:E2[v])dfs2(u); for(auto i:quer[v]){ A[i.nd]+=sum(pre[i.st], post[i.st]); } } std::vector<int> check_validity(int n, vi X, vi Y, vi S, vi T, vi L, vi R) { iota(r, r+N, 0); int m=X.size(), q = S.size(); for(int i=0; i<m; i++){ edg[X[i]].pb(Y[i]); edg[Y[i]].pb(X[i]); } vector<pair<int, int> > Q; for(int i=0; i<q; i++){ Q.push_back({R[i], i}); } sort(Q.begin(), Q.end()); int wsk=0; for(int i=0; i<n; i++){ for(int j:edg[i]){ if(j<i){ int v=find(j); if(i!=v){ r[v]=i; E[i].push_back(v); } } } while(wsk<q && Q[wsk].st==i){ //cout<<i<<" "<<T[Q[wsk].nd]<<" "<<find(T[Q[wsk].nd])<<"\n"; T[Q[wsk].nd]=find(T[Q[wsk].nd]); wsk++; } } //cout<<wsk<<"\n"; iota(r, r+N, 0); wsk=0; Q.clear(); for(int i=0; i<q; i++){ Q.push_back({L[i], i}); } sort(Q.begin(), Q.end()); reverse(Q.begin(), Q.end()); for(int i=n-1; i>=0; i--){ for(int j:edg[i]){ if(j>i){ int v=find(j); if(i!=v){ r[v]=i; E2[i].push_back(v); } } } while(wsk<q && Q[wsk].st==i){ S[Q[wsk].nd]=find(S[Q[wsk].nd]); wsk++; } } //cout<<wsk<<"a\n"; A.resize(q); dfs(n-1); for(int i=0; i<q; i++){ quer[S[i]].push_back({T[i], i}); } dfs2(0); for(int i=0; i<q; i++)A[i]=!!A[i]; return A; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...