Submission #1169354

#TimeUsernameProblemLanguageResultExecution timeMemory
1169354duccnamm늑대인간 (IOI18_werewolf)C++20
100 / 100
536 ms90848 KiB
#include<bits/stdc++.h> #include "werewolf.h" using namespace std; #define ll int ll n,m,q,f[200005],in1[200005],out1[200005],timedfs1,pos1[200005],in2[200005],out2[200005],timedfs2,st[200005][19][2],d1,d2,query1[200005],query2[200005],u,v,seg[800005]; vector<ll>a[200005],aa[200005]; struct node { ll a,b,c,d; }; vector<node>query[200005]; vector<ll>ans; ll check(ll i) { if(f[i]<0) return i; return f[i]=check(f[i]); } void connect(ll x,ll y,ll z) { if(x>y&&z==1) swap(x,y); if(x<y&&z==2) swap(x,y); f[x]+=f[y]; f[y]=x; } void dfs(ll x,ll pa) { st[x][0][0]=pa; timedfs1++; in1[x]=timedfs1; pos1[timedfs1]=x; for(ll it:aa[x]) if(it!=pa) dfs(it,x); out1[x]=timedfs1; } void dfs1(ll x,ll pa) { // cout<<x<<" "<<pa<<'\n'; st[x][0][1]=pa; timedfs2++; in2[x]=timedfs2; for(ll it:aa[x]) if(it!=pa) dfs1(it,x); out2[x]=timedfs2; } void update(ll id,ll l,ll r,ll u,ll v) { if(l>u||r<u)return; if(l==r) { seg[id]=v; return; } ll mid=(l+r)/2; update(id*2,l,mid,u,v); update(id*2+1,mid+1,r,u,v); seg[id]=max(seg[id*2],seg[id*2+1]); } ll getmax(ll id,ll l,ll r,ll u,ll v) { if(r<u||l>v) return 0; if(l>=u&&r<=v) return seg[id]; ll mid=(l+r)/2; return max(getmax(id*2,l,mid,u,v),getmax(id*2+1,mid+1,r,u,v)); } vector<ll> check_validity(int N,vector<ll>X,vector<ll>Y,vector<ll>S,vector<ll>E,vector<ll>L,vector<ll>R) { n=N; m=X.size(); q=S.size(); for(int i=0;i<m;i++) { a[X[i]+1].push_back(Y[i]+1); a[Y[i]+1].push_back(X[i]+1); } for(int i=1;i<=n;i++) f[i]=-1; for(int i=n;i>=1;i--) for(ll it:a[i]) if(it>i) { u=check(it); v=check(i); if(u!=v) { aa[v].push_back(u); aa[u].push_back(v); // cout<<u<<" "<<v<<'\n'; connect(u,v,1); } } dfs(1,1); for(int j=1;j<=18;j++) for(int i=1;i<=n;i++) st[i][j][0]=st[st[i][j-1][0]][j-1][0]; for(int i=0;i<q;i++) { d1=L[i]+1; d2=S[i]+1; for(int j=18;j>=0;j--) if(st[d2][j][0]>=d1) d2=st[d2][j][0]; query1[i+1]=d2; } for(int i=1;i<=n;i++) { f[i]=-1; aa[i].clear(); } for(int i=1;i<=n;i++) for(ll it:a[i]) if(it<i) { u=check(it); v=check(i); if(u!=v) { aa[v].push_back(u); aa[u].push_back(v); // cout<<u<<" "<<v<<'\n'; connect(u,v,2); } } dfs1(n,n); for(int j=1;j<=18;j++) for(int i=1;i<=n;i++) st[i][j][1]=st[st[i][j-1][1]][j-1][1]; for(int i=0;i<q;i++) { d1=R[i]+1; d2=E[i]+1; for(int j=18;j>=0;j--) if(st[d2][j][1]<=d1) d2=st[d2][j][1]; query2[i+1]=d2; // cout<<query1[i+1]<<" "<<query2[i+1]<<'\n'; } // for(int i=1;i<=n;i++) // { // cout<<i<<" "<<in1[i]<<" "<<out1[i]<<'\n'; // cout<<i<<" "<<in2[i]<<" "<<out2[i]<<'\n'; // } ans.resize(q); for(int i=1;i<=q;i++) { // cout<<query1[i]<<" "<<query2[i]<<" "<<in2[query1[i]]<<" "<<out2[query1[i]]<<'\n'; query[out1[query1[i]]].push_back({in1[query1[i]],in2[query2[i]],out2[query2[i]],i-1}); } for(int i=1;i<=n;i++) { // cout<<pos1[i]<<" "<<in2[pos1[i]]<<'\n'; update(1,1,n,in2[pos1[i]],i); for(node it:query[i]) { // cout<<i<<" "<<it.a<<" "<<it.b<<" "<<it.c<<" "<<it.d<<'\n'; d1=getmax(1,1,n,it.b,it.c); if(d1>=it.a) ans[it.d]=1; } } // for(ll it:ans) // cout<<it<<" "; return ans; } //int main() //{ // ios_base::sync_with_stdio(0); // cin.tie(0);cout.tie(0); // freopen("nam.inp","r",stdin); // freopen("nam.out","w",stdout); // cin>>n>>m>>q; // vector<ll>x,y,s,e,l,r; // x.resize(m); // y.resize(m); // s.resize(q); // e.resize(q); // l.resize(q); // r.resize(q); // for(int i=0;i<m;i++) // cin>>x[i]; // for(int i=0;i<m;i++) // cin>>y[i]; // for(int i=0;i<q;i++) // cin>>s[i]; // for(int i=0;i<q;i++) // cin>>e[i]; // for(int i=0;i<q;i++) // cin>>l[i]; // for(int i=0;i<q;i++) // cin>>r[i]; // check_validity(n,x,y,s,e,l,r); //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...