제출 #1127975

#제출 시각아이디문제언어결과실행 시간메모리
1127975bunhadasou동기화 (JOI13_synchronization)C++20
100 / 100
219 ms21932 KiB
#include <bits/stdc++.h> #define fi first #define se second #define mp make_pair #define PB push_back #define EB emplace_back #define ll long long #define bit(n,i) ((n>>i)&1) #define sz(x) (int)x.size() #define all(x) x.begin(),x.end() #define TASK "cf" using namespace std; struct fenwick{ vector<int>ft; int lim; void reset(int _n){ lim=_n+5; ft.assign(_n+10,0); } void upd(int pos,int val){ for(;pos<=lim;pos+=pos&-pos) ft[pos]+=val; } int get(int pos){ int res=0; for (;pos>0;pos-=pos&-pos) res+=ft[pos]; return res; } void updating(int l,int r,int val){ upd(l,val);upd(r+1,-val); } }; const int LOG=17; const int maxn=1e5+5; const int max_edge=2e5+5; vector<int>adj[maxn]; bool active[max_edge]; int in[maxn],out[maxn],par[maxn][LOG],val[maxn],last[maxn]; int time_dfs; pair<int,int>edge[max_edge]; int n,m,q; fenwick ft; int get_anc(int u){ int origin=u; for (int i=LOG-1;i>=0;i--) { if (par[u][i] &&ft.get(in[par[u][i]])==ft.get(in[origin])) u=par[u][i]; } return u; } void dfs(int u,int p){ in[u]=++time_dfs; for (auto v:adj[u]) { if (v==p) continue; par[v][0]=u; for (int i=1;i<LOG;i++) par[v][i]=par[par[v][i-1]][i-1]; dfs(v,u); } out[u]=time_dfs; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); // freopen(TASK".inp","r",stdin); // freopen(TASK".out","w",stdout); cin>>n>>m>>q; ft.reset(n); for (int i=1;i<n;i++){ int u,v; cin>>u>>v; edge[i].fi=u;edge[i].se=v; adj[u].PB(v);adj[v].PB(u); } dfs(1,-1); // for (int i=1;i<=n;i++) cout<<in[i]<<" "<<out[i]<<"\n"; for (int i=1;i<=n;i++) { ft.updating(in[i],out[i],-1); val[i]=1; } get_anc(1); for (int i=1;i<=m;i++) { int idx; cin>>idx; int u=edge[idx].fi,v=edge[idx].se; if (v==par[u][0]) swap(u,v); if (active[idx]){ // cout<<get_anc(u)<<" "<<val[get_anc(u)]<<"\n"; val[v]=last[v]=val[get_anc(u)]; ft.updating(in[v],out[v],-1); } else { val[get_anc(u)]+=val[v]-last[v]; ft.updating(in[v],out[v],1); } active[idx]=!active[idx]; } while(q--){ int u; cin>>u; cout<<val[get_anc(u)]<<"\n"; } cerr<<"Time running "<<1000*clock()/CLOCKS_PER_SEC<<" ms\n"; return 0; }
#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...