码迷,mamicode.com
首页 > 其他好文 > 详细

CF739B Alyona and a tree

时间:2019-10-28 14:27:51      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:ons   space   code   class   差分   void   +=   printf   ace   

倍增+差分

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+10;
#define int long long
int n,a[N],f[N][21],ans[N],dis[N];
int Next[2*N],head[N],go[N*2],w[N*2],tot;
inline void add(int u,int v,int o){
    Next[++tot]=head[u];head[u]=tot;go[tot]=v;w[tot]=o;
}
inline void dfs(int u){
    for(int i=1;i<=20;i++)
    f[u][i]=f[f[u][i-1]][i-1];
    int x=u;
    for(int i=20;i>=0;i--)
    if(f[x][i]&&dis[u]-dis[f[x][i]]<=a[u])
    x=f[x][i];
    ans[f[x][0]]--;
    ans[f[u][0]]++;
    for(int i=head[u];i;i=Next[i]){
        int v=go[i],d=w[i];
        f[v][0]=u;
        dis[v]=dis[u]+d;
        dfs(v);
        ans[u]+=ans[v];
    }
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(int i=2,u,d;i<=n;i++){
        scanf("%lld%lld",&u,&d);
        add(u,i,d);
    }
    dfs(1);
    for(int i=1;i<=n;i++)printf("%lld ",ans[i]);
}

CF739B Alyona and a tree

标签:ons   space   code   class   差分   void   +=   printf   ace   

原文地址:https://www.cnblogs.com/naruto-mzx/p/11751881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!