제출 #1171191

#제출 시각아이디문제언어결과실행 시간메모리
1171191mnbvcxz123Werewolf (IOI18_werewolf)C++20
100 / 100
615 ms85008 KiB
#include<bits/stdc++.h> #include"werewolf.h" using namespace std; constexpr int N=2e5+5; vector<int>sons[N<<1]; set<int>nodes[N]; int n; vector<int>ql[N],qr[N]; vector<int>g[N]; int nod_inter[N]; int st[N<<1],en[N<<1]; struct DSU{ int par[N<<1]; int id=0; void init(){ for(int i=0;i<2*n;++i)par[i]=i; id=n-1; } int root(int x){ if(par[x]==x)return x; return par[x]=root(par[x]); } void unite1(int u, int v){ u=root(u); v=root(v); if(u==v)return; ++id; sons[id].push_back(u); sons[id].push_back(v); par[u]=par[v]=id; } void unite2(int u, int v){ u=root(u); v=root(v); if(u==v)return; if(nodes[u].size()<nodes[v].size())swap(u,v); par[v]=u; for(auto it:nodes[v])nodes[u].insert(it); nodes[v].clear(); } }dsu; void dfs(int v){ static int tr=0; st[v]=tr; for(const int&i:sons[v]) dfs(i); if(sons[v].empty())++tr; en[v]=tr-1; } vector<int>check_validity(int N,vector<int>X,vector<int>Y,vector<int>S,vector<int>E,vector<int>L,vector<int>R){ int q=S.size(); int m=X.size(); n=N; for(int i=0;i<q;++i){ ql[L[i]].push_back(i); qr[R[i]].push_back(i); } for(int i=0;i<m;++i){ g[X[i]].push_back(Y[i]); g[Y[i]].push_back(X[i]); } dsu.init(); for(int i=n-1;i>=0;--i){ for(auto vec:g[i]) if(vec>i) dsu.unite1(i,vec); for(auto qry:ql[i]) nod_inter[qry]=dsu.root(S[qry]); } dfs(dsu.id); dsu.init(); for(int i=0;i<n;++i)nodes[i].insert(st[i]); vector<int>ans(q); for(int i=0;i<n;++i){ for(auto vec:g[i]) if(vec<i)dsu.unite2(i,vec); for(auto qry:qr[i]){ int pos=E[qry]; int rt=dsu.root(pos); int intv=nod_inter[qry]; auto it=nodes[rt].lower_bound(st[intv]); if(it!=nodes[rt].end() and *it<=en[intv])ans[qry]=1; else ans[qry]=0; } } 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...