Submission #924914

#TimeUsernameProblemLanguageResultExecution timeMemory
924914Faisal_SaqibCat in a tree (BOI17_catinatree)C++17
0 / 100
2 ms9816 KiB
#include <iostream> #include <vector> #include <bitset> #include <queue> using namespace std; const int N=2e5+10; int n,d; vector<int> ma[N],vep[N]; int h[N],dist[N],root[N]; bitset<N> rem; bitset<N> vis; bitset<N> kill; int main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); cin>>n>>d; if(d==1) { cout<<n<<endl; return 0; } vep[0].push_back(1); int max_h=0; for(int i=2;i<=n;i++) { int p; cin>>p; p++; h[i]=h[p]+1; vep[h[i]].push_back(i); max_h=max(max_h,h[i]); ma[p].push_back(i); ma[i].push_back(p); } int ans=0; for(int i=1;i<=n;i++) dist[i]=1e6; for(int cur_h=max_h;cur_h>=0;cur_h--) { queue<int> q; int st=0; for(int v:vep[cur_h]) { if(!rem[v]) { q.push(v); root[v]=v; st++; dist[v]=0; vis.set(v); } } vector<int> visited; while(q.size()) { int v=q.front(); q.pop(); if(dist[v]>=d) continue; visited.push_back(v); rem.set(v); for(int y:ma[v]) { if(!vis[y]) { dist[y]=dist[v]+1; q.push(y); root[y]=root[v]; vis.set(y); } else if(dist[y]==dist[v]+1 and (dist[y]+dist[v]+1)<d and !kill[root[v]]) { st--; kill[root[v]]=1; } } } for(int u:visited) vis[u]=0; ans+=st; } cout<<ans<<'\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...