CF739B Alyona and a tree
Posted naruto-mzx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF739B Alyona and a tree相关的知识,希望对你有一定的参考价值。
倍增+差分
#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的主要内容,如果未能解决你的问题,请参考以下文章
Alyona and a tree CodeForces - 739B (线段树合并)