Submission #1307106

#TimeUsernameProblemLanguageResultExecution timeMemory
1307106StefanSebezCat in a tree (BOI17_catinatree)C++20
100 / 100
344 ms38308 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const int N=2e5+50,lg=18,inf=1e9;
vector<int>E[N];
int n,D;
bool deleted[N];
int depth[N],par[N][lg+1];
void DFS1(int u,int p=0,int d=0){
    depth[u]=d;par[u][0]=p;
    for(int i=1;i<=lg;i++)par[u][i]=par[par[u][i-1]][i-1];
    for(auto i:E[u])if(i!=p)DFS1(i,u,d+1);
}
int LCA(int u,int v){
    if(depth[u]<depth[v])swap(u,v);
    for(int i=lg;i>=0;i--)if(depth[par[u][i]]>=depth[v])u=par[u][i];if(u==v)return u;
    for(int i=lg;i>=0;i--)if(par[u][i]!=par[v][i])u=par[u][i],v=par[v][i];return par[u][0];
}
int Dist(int u,int v){return depth[u]+depth[v]-2*depth[LCA(u,v)];}
int sajz[N],pr[N],mndist[N];bool was[N];
void DFScalc(int u,int p=0){
    sajz[u]=1;
    for(auto i:E[u])if(i!=p&&!was[i])DFScalc(i,u),sajz[u]+=sajz[i];
}
int DFSC(int u,int prvi,int p=0){
    for(auto i:E[u])if(!was[i]&&i!=p&&2*sajz[i]>=sajz[prvi])return DFSC(i,prvi,u);
    return u;
}
int CD(int u){
    DFScalc(u);
    u=DFSC(u,u);
    was[u]=true;
    for(auto i:E[u])if(!was[i])pr[CD(i)]=u;
    return u;
}
void Update(int u){
    for(int v=u;v;v=pr[v])mndist[v]=min(mndist[v],Dist(u,v));
}
int Get(int u){
    int res=inf;
    for(int v=u;v;v=pr[v])res=min(res,Dist(u,v)+mndist[v]);
    return res;
}
int main(){
    scanf("%i%i",&n,&D);
    for(int v=2;v<=n;v++){
        int u;scanf("%i",&u);u++;
        E[u].pb(v),E[v].pb(u);
    }
    int res=0;
    DFS1(1);
    int ind[n+10];iota(ind+1,ind+n+1,1);
    sort(ind+1,ind+n+1,[&](int i,int j){return depth[i]>depth[j];});
    CD(1);for(int i=1;i<=n;i++)mndist[i]=inf;
    for(int i=1;i<=n;i++)if(Get(ind[i])>=D)res++,Update(ind[i]);
    printf("%i\n",res);
    return 0;
}

Compilation message (stderr)

catinatree.cpp: In function 'int main()':
catinatree.cpp:50:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |     scanf("%i%i",&n,&D);
      |     ~~~~~^~~~~~~~~~~~~~
catinatree.cpp:52:20: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   52 |         int u;scanf("%i",&u);u++;
      |               ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...