Submission #1231303

#TimeUsernameProblemLanguageResultExecution timeMemory
1231303MalixCat in a tree (BOI17_catinatree)C++20
0 / 100
86 ms201792 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> ti;
typedef vector<ll> li;
typedef vector<li> lii;
 
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
#define all(x) (x).begin(),(x).end()
 
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;

vii a;
int dist[200000],vis[100000];
vi st,lazy,lazyval,p,arr,s,b;

void dfs(int x){
    arr.PB(x);
    vis[x]=1;
    for(auto u:a[x])if(!vis[u]){
        dist[u]=dist[x]+1;
        dfs(u);
        s[x]+=s[u];
    }
}

void propagate(int x){
    if(!lazy[x])return;
    lazy[x]=0;
    st[2*x]=min(st[2*x],lazyval[x]);
    st[2*x+1]=min(st[2*x+1],lazyval[x]);
    lazy[2*x]=1;
    lazy[2*x+1]=1;
    lazyval[2*x]=lazyval[x];
    lazyval[2*x+1]=lazyval[x];
}

int query(int x,int l,int r,int u){
    if(l==r)return st[x];
    propagate(x);
    int m=(l+r)/2;
    if(u<=m)return query(2*x,l,m,u);
    else return query(2*x+1,m+1,r,u);
}

void update(int x,int l,int r,int u,int v,int y){
    if(u>v)return;
    if(l!=r)propagate(x);
    if(u==l&&v==r){
        st[x]=min(st[x],y);
        lazy[x]=1;
        lazyval[x]=y;
        return;
    }
    int m=(l+r)/2;
    update(2*x,l,m,u,min(m,v),y);
    update(2*x+1,m+1,r,max(u,m+1),v,y);
    st[x]=min(st[2*x],st[2*x+1]);
}

int main(){
// ios::sync_with_stdio(0);
// cin.tie(0);
freopen("test_input.txt", "r", stdin);
freopen("test_output.txt", "w", stdout);
    int n,d;cin>>n>>d;
    a.resize(n);p.resize(n,-1);
    REP(i,1,n){
        int x;cin>>x;
        p[i]=x;
        a[x].PB(i);
        a[i].PB(x);
    }
    st.resize(4*n+1,inf);
    lazy.resize(4*n+1,0);
    lazyval.resize(4*n+1,0);
    s.resize(n,1);
    memset(vis,0,sizeof(vis));
    dist[0]=0;
    dfs(0);
    b.resize(n);
    REP(i,0,n)b[arr[i]]=i;
    priority_queue<pi> pq;
    REP(i,0,n)pq.push({dist[i],i});
    int ans=0;
    while(!pq.empty()){
        int x=pq.top().S;
        pq.pop();
        if(query(1,0,n-1,b[x])+dist[x]<d)continue;
        ans++;
        int t=d,z=x;
        while(t--&&x!=-1){
            int y=b[x];
            update(1,0,n-1,y,y+s[x]-1,dist[z]-2*dist[x]);
            x=p[x];
        }
    }
    cout<<ans;
}

Compilation message (stderr)

catinatree.cpp: In function 'int main()':
catinatree.cpp:75:8: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 | freopen("test_input.txt", "r", stdin);
      | ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
catinatree.cpp:76:8: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 | freopen("test_output.txt", "w", stdout);
      | ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...