Submission #1177482

#TimeUsernameProblemLanguageResultExecution timeMemory
1177482vneduSynchronization (JOI13_synchronization)C++20
100 / 100
177 ms24132 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; template<class T> bool maximize(T &a, const T &b){ return (a < b ? a = b, 1 : 0); } template<class T> bool minimize(T &a, const T &b){ return (a > b ? a = b, 1 : 0); } #define fi first #define se second #define pb push_back #define ii pair<int, int> #define all(x) x.begin(), x.end() #define TASK "nonsense" /// end of template /// const int N = 1e5 + 15; int numNode,numState,numQuery,dep[N],st[N],en[N],tg=0,bit[N*2],up[N][20]; vector<int> adj[N]; ii edge[N]; void add(int x, int val) { while (x<=2*numNode) { bit[x]+=val; x+=x&-x; } } int get(int x) { int ans=0; while (x>=1) { ans+=bit[x]; x-=x&-x; } return ans; } void dfs(int u, int pa) { up[u][0]=pa; for (int j=1; j<20; ++j) if ((1<<j)<dep[u]) up[u][j]=up[up[u][j-1]][j-1]; st[u]=++tg; for (int v : adj[u]) if (v!=pa) { dep[v]=dep[u]+1; dfs(v,u); } en[u]=++tg; } int findRoot(int u) { for (int j=19; j>=0; --j) if ((1<<j)<dep[u]) { int v=up[u][j]; if (dep[u]-dep[v]==get(st[u])-get(st[v])) u=v; } return u; } int lst[N],uni[N]; void solve() { cin>>numNode>>numState>>numQuery; for (int i=1; i<numNode; ++i) { int u,v; cin>>u>>v; edge[i]={u,v}; adj[u].pb(v); adj[v].pb(u); } dep[1]=1; dfs(1,-1); for (int i=1; i<numNode; ++i) { if (dep[edge[i].fi]<dep[edge[i].se]) swap(edge[i].fi,edge[i].se); } for (int i=1; i<=numNode; ++i) uni[i]=1; for (int tri=1; tri<=numState; ++tri) { int x; cin>>x; if (lst[x]==-1) { int u=edge[x].fi,v=edge[x].se; uni[u]=uni[findRoot(v)]; add(st[u],-1); add(en[u]+1,1); lst[x]=uni[u]; } else { int u=edge[x].fi,v=edge[x].se; int &cur=uni[findRoot(v)]; cur+=uni[u]; cur-=lst[x]; add(st[u],1); add(en[u]+1,-1); lst[x]=-1; } } while (numQuery--) { int x; cin>>x; cout<<uni[findRoot(x)]<<'\n'; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen(TASK".inp","r",stdin); // freopen(TASK".out","w",stdout); int testcase=1; // cin>>testcase; while (testcase--) solve(); // #define TIME (1.0 * clock() / CLOCKS_PER_SEC) // cerr << "Time elapsed: " << TIME << " s.\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...