제출 #128974

#제출 시각아이디문제언어결과실행 시간메모리
128974Kerim늑대인간 (IOI18_werewolf)C++17
100 / 100
1085 ms119016 KiB
#include "werewolf.h" #include "bits/stdc++.h" #define MAXN 200009 #define INF 1000000007 #define mp(x,y) make_pair(x,y) #define all(v) v.begin(),v.end() #define pb(x) push_back(x) #define wr cout<<"----------------"<<endl; #define ppb() pop_back() #define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++) #define ff first #define ss second #define my_little_dodge 46 #define debug(x) cerr<< #x <<" = "<< x<<endl; using namespace std; typedef long long ll; typedef pair<int,int> PII; template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;} template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;} int n,m,q,ata[MAXN]; int tap(int x){ if(ata[x]==x) return x; return ata[x]=tap(ata[x]); } vector<int>adj[MAXN][2],a[MAXN],b[MAXN]; int in[MAXN][2],out[MAXN][2],id[MAXN][2],P[MAXN][18][2],pos[MAXN],TIM; void dfs(int nd,int t){ in[nd][t]=++TIM; id[TIM][t]=nd; tr(it,adj[nd][t]) dfs(*it,t); out[nd][t]=TIM; } vector<pair<int,PII> >query[MAXN][2]; int F[MAXN]; void upd(int x){ for(;x<MAXN;x+=x&(-x)) F[x]++; } int tap(int l,int r){l--; int res=0; for(;r;r-=r&(-r)) res+=F[r]; for(;l;l-=l&(-l)) res-=F[l]; return res; } vector<int>check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E,vector<int> L, vector<int> R) { q=S.size();n=N;m=X.size(); for(int i=0;i<m;i++){ int u=X[i]+1,v=Y[i]+1; if(u>v) swap(u,v); a[u].pb(v);b[v].pb(u); } for(int i=1;i<=n;i++) ata[i]=i; for(int i=1;i<=n;i++) tr(it,b[i]) if(tap(*it)!=i){ adj[i][0].pb(tap(*it)); P[tap(*it)][0][0]=i; ata[tap(*it)]=i; } for(int i=1;i<=n;i++) ata[i]=i; for(int i=n;i>=1;i--) tr(it,a[i]) if(tap(*it)!=i){ adj[i][1].pb(tap(*it)); P[tap(*it)][0][1]=i; ata[tap(*it)]=i; } for(int h=0;h<2;h++) for(int j=1;j<=17;j++) for(int i=1;i<=n;i++) if(P[i][j-1][h]) P[i][j][h]=P[P[i][j-1][h]][j-1][h]; vector<int>ans(q); dfs(n,0);TIM=0;dfs(1,1); for(int i=1;i<=n;i++) pos[id[i][1]]=i; for(int i=0;i<q;i++){ int s=S[i]+1,e=E[i]+1,l=L[i]+1,r=R[i]+1; for(int j=17;j>=0;j--){ if(P[s][j][1]>=l) s=P[s][j][1]; if(P[e][j][0] and P[e][j][0]<=r) e=P[e][j][0]; } //while(par[s][1]>=l) // s=par[s][1]; //while(par[e][0] and par[e][0]<=r) // e=par[e][0]; query[in[e][0]][0].pb(mp(i,mp(in[s][1],out[s][1]))); query[out[e][0]][1].pb(mp(i,mp(in[s][1],out[s][1]))); } for(int i=1;i<=n;i++){ tr(it,query[i][0]) ans[it->ff]-=tap(it->ss.ff,it->ss.ss); upd(pos[id[i][0]]); tr(it,query[i][1]) ans[it->ff]+=tap(it->ss.ff,it->ss.ss); } for(int i=0;i<q;i++) umin(ans[i],1); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...