Submission #628239

#TimeUsernameProblemLanguageResultExecution timeMemory
628239alexander707070Werewolf (IOI18_werewolf)C++14
15 / 100
4070 ms36340 KiB
#include <bits/stdc++.h> #define MAXN 200007 using namespace std; const int bucket_sz=400; int n,m,a,b,bucket[MAXN],q,l,r; struct event{ int id; int val; int tim; }; struct qr{ int s,e; int l,r; int id; inline friend bool operator < (qr fr,qr sc){ if(bucket[fr.l]!=bucket[sc.l])return bucket[fr.l]<bucket[sc.l]; else return fr.r<sc.r; } }; vector<int> v[MAXN]; stack<event> sl,sr; qr qs[MAXN]; int ldsu[MAXN],rdsu[MAXN],lsz[MAXN],rsz[MAXN]; int timl,timr; vector<int> ans; int rootL(int x){ if(ldsu[x]==x)return ldsu[x]; return rootL(ldsu[x]); } int rootR(int x){ if(rdsu[x]==x)return rdsu[x]; return rootR(rdsu[x]); } void connectL(int x,int y){ timl++; int rootx=rootL(x); int rooty=rootL(y); if(rootx==rooty)return; if(lsz[rootx]<lsz[rooty])swap(rootx,rooty); sl.push({rooty,ldsu[rooty],timl}); sl.push({-rootx,lsz[rootx],timl}); ldsu[rooty]=rootx; lsz[rootx]+=lsz[rooty]; } void connectR(int x,int y){ timr++; int rootx=rootR(x); int rooty=rootR(y); if(rootx==rooty)return; if(rsz[rootx]<rsz[rooty])swap(rootx,rooty); sr.push({rooty,rdsu[rooty],timr}); sr.push({-rootx,rsz[rootx],timr}); rdsu[rooty]=rootx; rsz[rootx]+=rsz[rooty]; } void undoL(){ while(!sl.empty() and sl.top().tim==timl){ if(sl.top().id<0)lsz[-sl.top().id]=sl.top().val; else ldsu[sl.top().id]=sl.top().val; sl.pop(); } timl--; } void undoR(){ while(!sr.empty() and sr.top().tim==timr){ if(sr.top().id<0)rsz[-sr.top().id]=sr.top().val; else rdsu[sr.top().id]=sr.top().val; sr.pop(); } timr--; } void pushfront(int x){ for(int i=0;i<v[x].size();i++){ if(v[x][i]>x)connectL(x,v[x][i]); } } void popfront(int x){ for(int i=0;i<v[x].size();i++){ if(v[x][i]>x)undoL(); } } void pushback(int x){ for(int i=0;i<v[x].size();i++){ if(v[x][i]<x)connectR(x,v[x][i]); } } void popback(int x){ for(int i=0;i<v[x].size();i++){ if(v[x][i]<x)undoR(); } } int check(int s,int e){ for(int i=0;i<n;i++){ if(rootL(i)==rootL(s) and rootR(i)==rootR(e))return 1; } return 0; } 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; m=int(X.size()); q=int(S.size()); ans.resize(q); for(int i=0;i<n;i++){ ldsu[i]=rdsu[i]=i; lsz[i]=rsz[i]=1; } for(int i=1;i<=m;i++){ a=X[i-1]; b=Y[i-1]; v[a].push_back(b); v[b].push_back(a); } for(int i=0;i<=n;i++){ bucket[i]=i/bucket_sz; } for(int i=0;i<q;i++){ qs[i].s=S[i]; qs[i].e=E[i]; qs[i].l=L[i]; qs[i].r=R[i]; qs[i].id=i; } sort(qs,qs+q); l=n; r=-1; for(int i=0;i<q;i++){ while(l>qs[i].l){ l--; pushfront(l); } while(l<qs[i].l){ popfront(l); l++; } while(r<qs[i].r){ r++; pushback(r); } while(r>qs[i].r){ popback(r); r--; } ans[qs[i].id]=check(qs[i].s,qs[i].e); } return ans; }

Compilation message (stderr)

werewolf.cpp: In function 'void pushfront(int)':
werewolf.cpp:86:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
werewolf.cpp: In function 'void popfront(int)':
werewolf.cpp:92:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
werewolf.cpp: In function 'void pushback(int)':
werewolf.cpp:98:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
werewolf.cpp: In function 'void popback(int)':
werewolf.cpp:104:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |     for(int i=0;i<v[x].size();i++){
      |                 ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...