Submission #553241

#TimeUsernameProblemLanguageResultExecution timeMemory
553241jamezzzWerewolf (IOI18_werewolf)C++17
100 / 100
906 ms144460 KiB
#include "werewolf.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pf printf #define pb push_back #define all(x) x.begin(),x.end() typedef vector<int> vi; typedef pair<int,int> ii; #define maxn 400005 int cnt,par[maxn]; void init(int N){ for(int i=0;i<N;++i){ par[i]=i; } } int fp(int i){ return (par[i]==i)?i:par[i]=fp(par[i]); } int join(int x,int y){ x=fp(x),y=fp(y); par[x]=par[y]=cnt; return cnt++; } vi AL1[maxn],AL2[maxn],ord1; int dfscnt; int p1[maxn][20],w1[maxn],r1[maxn],pre1[maxn],pst1[maxn]; int p2[maxn][20],w2[maxn],r2[maxn],pre2[maxn],pst2[maxn],pos[maxn]; void dfs1(int u){ pre1[u]=dfscnt; if(AL1[u].size()==0){ ++dfscnt; ord1.pb(u); } for(int v:AL1[u]){ p1[v][0]=u; dfs1(v); } pst1[u]=dfscnt-1; } void dfs2(int u){ pre2[u]=dfscnt; if(AL2[u].size()==0){ ++dfscnt; } for(int v:AL2[u]){ p2[v][0]=u; dfs2(v); } pst2[u]=dfscnt-1; } int n,v[2*maxn]; void up(int i,int s,int e,int x,int nv){ if(s==x&&e==x){v[i]=nv;return;} int m=(s+e)>>1; if(x<=m)up(2*i+1,s,m,x,nv); else up(2*i+2,m+1,e,x,nv); v[i]=max(v[2*i+1],v[2*i+2]); } void up(int x,int nv){ up(0,0,n-1,x,nv); } int qry(int i,int s,int e,int x,int y){ if(s==x&&e==y)return v[i]; int m=(s+e)>>1; if(y<=m)return qry(2*i+1,s,m,x,y); if(x>m)return qry(2*i+2,m+1,e,x,y); return max(qry(2*i+1,s,m,x,m),qry(2*i+2,m+1,e,m+1,y)); } int qry(int x,int y){ return qry(0,0,n-1,x,y); } struct query{ int l1,r1,l2,r2,i; }; vector<query> qrys; vi check_validity(int N,vi X,vi Y,vi S,vi E,vi L,vi R){ int Q=S.size(),M=X.size(); vector<ii> edges; for(int i=0;i<M;++i){ edges.pb({X[i],Y[i]}); } sort(all(edges),[](ii &a,ii &b){return min(a.fi,a.se)>min(b.fi,b.se);}); init(2*N);cnt=N; for(ii pr:edges){ int a=fp(pr.fi),b=fp(pr.se); if(a!=b){ int p=join(a,b); w1[p]=min(pr.fi,pr.se); AL1[p].pb(a); AL1[p].pb(b); } } sort(all(edges),[](ii &a,ii &b){return max(a.fi,a.se)<max(b.fi,b.se);}); init(2*N);cnt=N; for(ii pr:edges){ int a=fp(pr.fi),b=fp(pr.se); if(a!=b){ int p=join(a,b); w2[p]=max(pr.fi,pr.se); AL2[p].pb(a); AL2[p].pb(b); } } memset(p1,-1,sizeof p1); dfscnt=0; dfs1(cnt-1); memset(p2,-1,sizeof p2); dfscnt=0; dfs2(cnt-1); for(int k=1;k<20;++k){ for(int i=0;i<cnt;++i){ if(p1[i][k-1]!=-1)p1[i][k]=p1[p1[i][k-1]][k-1]; if(p2[i][k-1]!=-1)p2[i][k]=p2[p2[i][k-1]][k-1]; } } //pf("pre1: ");for(int i=0;i<N;++i)pf("%d ",pre1[i]);pf("\n"); //pf("pre2: ");for(int i=0;i<N;++i)pf("%d ",pre2[i]);pf("\n"); //pf("w1: ");for(int i=0;i<cnt;++i)pf("%d ",w1[i]);pf("\n"); //pf("w2: ");for(int i=0;i<cnt;++i)pf("%d ",w2[i]);pf("\n"); for(int i=0;i<Q;++i){ query q={0,0,0,0,i}; //pf("qry: %d %d %d %d\n",S[i],E[i],L[i],R[i]); int cur=S[i]; for(int k=19;k>=0;--k){ if(p1[cur][k]!=-1&&w1[p1[cur][k]]>=L[i])cur=p1[cur][k]; } q.l1=pre1[cur]; q.r1=pst1[cur]; cur=E[i]; for(int k=19;k>=0;--k){ if(p2[cur][k]!=-1&&w2[p2[cur][k]]<=R[i])cur=p2[cur][k]; } q.l2=pre2[cur]; q.r2=pst2[cur]; //pf("%d %d %d %d\n",q.l1,q.r1,q.l2,q.r2); qrys.pb(q); } vi A(Q,0); sort(all(qrys),[](query &a,query &b){return a.r1<b.r1;}); n=N;memset(v,-1,sizeof v); int pv=-1; for(int i=0;i<Q;++i){ query &q=qrys[i]; while(pv<q.r1){ ++pv; int x=ord1[pv];//node index int pos=pre2[x];//preorder up(pos,pv); } int val=qry(q.l2,q.r2); if(val>=q.l1)A[q.i]=1; } 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...