Submission #474035

#TimeUsernameProblemLanguageResultExecution timeMemory
474035nicolaalexandraSynchronization (JOI13_synchronization)C++14
100 / 100
838 ms25892 KiB
#include <bits/stdc++.h> #define DIM 200010 using namespace std; vector <int> L[DIM]; pair <int,int> poz[DIM],mch[DIM]; int E[DIM],level[DIM],fth[DIM],stramos[22][DIM],aib[DIM],v[DIM],c[DIM],stare[DIM]; int n,m,q,i,j,x,y,k,idx; void dfs (int nod, int tata){ E[++k] = nod; poz[nod].first = k; fth[nod] = tata; level[nod] = 1 + level[tata]; for (auto vecin : L[nod]){ if (vecin != tata) dfs (vecin,nod); } poz[nod].second = k; } void update (int p, int val){ for (;p<=n;p+=(p&-p)) aib[p] += val; } int query (int p){ int sol = 0; for (;p;p-=(p&-p)) sol += aib[p]; return sol; } int get_root (int x){ for (int p=20;p>=0;p--){ int y = stramos[p][x]; if (!y) continue; if (query(poz[x].first) - query(poz[y].first) == level[x] - level[y]) x = y; } return x; } int main (){ //ifstream cin ("date.in"); //ofstream cout ("date.out"); cin>>n>>m>>q; for (i=1;i<n;i++){ cin>>x>>y; L[x].push_back(y); L[y].push_back(x); mch[i] = make_pair(x,y); } dfs (1,0); for (i=1;i<=n;i++){ stramos[0][i] = fth[i]; v[i] = 1; } for (i=1;(1<<i)<=n;i++) for (j=1;j<=n;j++) stramos[i][j] = stramos[i-1][stramos[i-1][j]]; for (i=1;i<=m;i++){ cin>>idx; int x = mch[idx].first, y = mch[idx].second; if (fth[x] == y) swap (x,y); int root = get_root (x); if (stare[y]){ /// disconnect v[y] = c[y] = v[root]; update (poz[y].first,-1); update (poz[y].second+1,1); } else { /// connect v[root] = v[root] + v[y] - c[y]; update (poz[y].first,1); update (poz[y].second+1,-1); } stare[y] = 1 - stare[y]; } for (;q--;){ cin>>x; cout<<v[get_root(x)]<<"\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...