제출 #274226

#제출 시각아이디문제언어결과실행 시간메모리
274226LifeHappen__동기화 (JOI13_synchronization)C++14
100 / 100
437 ms38820 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define forinc(a,b,c) for(int a=b, _c=c; a<=_c; ++a) #define fordec(a,b,c) for(int a=b, _c=c; a>=_c; --a) #define forv(v,a) for(auto &v:a) #define ii pair<int,int> #define fi first #define se second #define pb push_back #define all(a) begin(a),end(a) const int N=2e5+5; int n,m,q,st[N],en[N],id; vector<int> ad[N]; ii edge[N]; int pd[N][21],it[N],act[N],a[N],last[N]; void dfs(int u,int par){ forinc(i,1,20) pd[u][i]=pd[pd[u][i-1]][i-1]; st[u]=++id; a[u]=1; forv(v,ad[u]) if(v!=par){ pd[v][0]=u; dfs(v,u); } en[u]=id; } void upd(int i,int val){ for(; i<=n; i+=i&-i) { it[i]+=val; } } int get(int i){ int ans=0; for(; i; i-=i&-i){ ans+=it[i]; } return ans; } void up(int l,int r,int val){ //cerr<<l<<' '<<r+1<<'\n'; upd(l,val); upd(r+1, -val); } int root(int x){ fordec(i,20,0) if(pd[x][i]!=0 && get(st[pd[x][i]])==get(st[x])) x=pd[x][i]; return x; } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m>>q; forinc(i,1,n-1){ cin>>edge[i].fi>>edge[i].se; ad[edge[i].fi].pb(edge[i].se); ad[edge[i].se].pb(edge[i].fi); } dfs(1,0); //forinc(i,1,n) cout<<st[i]<<'\n'; forinc(i,1,n) up(st[i],en[i],1); while(m--){ int now; cin>>now; int u,v; tie(u,v)=edge[now]; //cerr<<u<<' '<<v<<'\n'; if(pd[u][0]==v) swap(u,v); if(act[now]){ a[v]=last[v]=a[root(u)]; up(st[v],en[v],1); } else{ a[root(u)]+=a[v]-last[v]; up(st[v],en[v],-1); } act[now]=!act[now]; } while(q--){ int x; cin>>x; cout<<a[root(x)]<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...