codeforces 381 D Alyona and a tree(倍增)(前缀数组)
Alyona and a tree
2 seconds
256 megabytes
standard input
standard output
Alyona has a tree with n vertices. The root of the tree is the vertex 1. In each vertex Alyona wrote an positive integer, in the vertex i she wrote ai. Moreover, the girl wrote a positive integer to every edge of the tree (possibly, different integers on different edges).
Let's define dist(v, u) as the sum of the integers written on the edges of the simple path from v to u.
The vertex v controls the vertex u (v ≠ u) if and only if u is in the subtree of v and dist(v, u) ≤ au.
Alyona wants to settle in some vertex. In order to do this, she wants to know for each vertex v what is the number of vertices u such that v controls u.
The first line contains single integer n (1 ≤ n ≤ 2·105).
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the integers written in the vertices.
The next (n - 1) lines contain two integers each. The i-th of these lines contains integers pi and wi (1 ≤ pi ≤ n, 1 ≤ wi ≤ 109) — the parent of the (i + 1)-th vertex in the tree and the number written on the edge between pi and (i + 1).
It is guaranteed that the given graph is a tree.
Print n integers — the i-th of these numbers should be equal to the number of vertices that the i-th vertex controls.
5
2 5 1 4 6
1 7
1 1
3 5
3 6
1 0 1 0 0
5
9 7 8 6 5
1 1
2 1
3 1
4 1
4 3 2 1 0
In the example test case the vertex 1 controls the vertex 3, the vertex 3 controls the vertex 5 (note that is doesn't mean the vertex 1 controls the vertex 5).
【分析】题意就不说了,说下怎么做。很显然暴力肯定超时。对于每一个节点,用倍增的思想,fa[i][x]、cost[i][x]数组分别记录x节点往上第2的i次方个祖先编号和与那个祖先的距离。如果节点x对节点f有一个贡献,那么x对处于x和f之间的节点也应该有一个贡献,所以用前缀数组的思想,ans[x]++,ans[f]--,然后只需要在dfs的时候一个一个累加就行了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
typedef long long ll;
using namespace std;
const int N = 2e5+;
int n,m,k,u;
int fa[][N];
ll cost[][N];
ll a[N],ans[N];
struct man{
int son;
ll co;
};
vector<man>edg[N];
void dfs(int x){
for(int i=;fa[i-][fa[i-][x]];i++){
fa[i][x]=fa[i-][fa[i-][x]];
cost[i][x]=cost[i-][x]+cost[i-][fa[i-][x]];
}
for(int i=;i<edg[x].size();i++){
man e=edg[x][i];
int v=e.son;ll c=e.co;
fa[][v]=x;cost[][v]=c;
dfs(v);
}
}
int Find(int x){
ll c=a[x];
for(int i=;i>=;i--){
if(cost[i][x]<=c&&fa[i][x]){
c-=cost[i][x];
x=fa[i][x];
}
}
return x;
}
void sum_dfs(int x){
for(int i=;i<edg[x].size();i++){
man e=edg[x][i];
int v=e.son;ll c=e.co;
sum_dfs(v);
ans[x]+=ans[v];
}
}
int main (){
ll c;
met(ans,);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
for(int i=;i<=n;i++){
scanf("%d%lld",&u,&c);
man s;s.co=c;s.son=i;
edg[u].push_back(s);
}
dfs();
for(int i=;i<=n;i++){
int f=Find(i);
ans[fa[][f]]--;
ans[fa[][i]]++;
}
sum_dfs();
for(int i=;i<=n;i++)printf("%lld ",ans[i]);printf("\n");
return ;
}
codeforces 381 D Alyona and a tree(倍增)(前缀数组)的更多相关文章
- 【30.36%】【codeforces 740D】Alyona and a tree
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- codeforces 682C C. Alyona and the Tree(dfs)
题目链接: C. Alyona and the Tree time limit per test 1 second memory limit per test 256 megabytes input ...
- 【CodeForces - 682C】Alyona and the Tree(dfs)
Alyona and the Tree Descriptions 小灵决定节食,于是去森林里摘了些苹果.在那里,她意外地发现了一棵神奇的有根树,它的根在节点 1 上,每个节点和每条边上都有一个数字. ...
- 【Codeforces 682C】Alyona and the Tree
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 设dis[v]表示v以上的点到达这个点的最大权值(肯定是它的祖先中的某个点到这个点) 类似于最大连续累加和 当往下走(x,y)这条边的时候,设 ...
- Codeforces Round #381 (Div. 2) D. Alyona and a tree 树上二分+前缀和思想
题目链接: http://codeforces.com/contest/740/problem/D D. Alyona and a tree time limit per test2 secondsm ...
- Codeforces Round #381 (Div. 1) B. Alyona and a tree dfs序 二分 前缀和
B. Alyona and a tree 题目连接: http://codeforces.com/contest/739/problem/B Description Alyona has a tree ...
- XJOI 3363 树4/ Codeforces 739B Alyona and a tree(树上差分+路径倍增)
D. Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Codeforces Round #381 (Div. 2)D. Alyona and a tree(树+二分+dfs)
D. Alyona and a tree Problem Description: Alyona has a tree with n vertices. The root of the tree is ...
- Codeforces Round #381 (Div. 2) D. Alyona and a tree dfs序+树状数组
D. Alyona and a tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
随机推荐
- Android Studio 简单设置
转自:http://ask.android-studio.org/?/article/14 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings - ...
- Git学习(4)基本操作
1.版本提交 首先,接着上个Git学习(3)继续 我们先修改test.txt文本内容,增加一些信息进去,然后保存: Add a new data 第一步:运行命令 git status 命令查看文件是 ...
- JDK中的native2ascii命令详解
1.native2ascii简介: native2ascii是sun java sdk提供的一个工具.用来将别的文本类文件(比如*.txt,*.ini,*.properties,*.java等等)编码 ...
- 【Java基础】分支结构(1)
java 分支结构 if , if else , if elseif if /** 文件路径:G:\JavaByHands\if-else\ 文件名称:IfElseT.java 编写时间:2016/6 ...
- android ViewGroup事件分发机制
1:事件分销过程 自定义一个LinearLayout,重写dispatchTouchEvent onInterceptTouchEvent onTouchEvent,定义一个按键重写dispathcT ...
- c#遍历并判断实体或类的成员属性
c#的Attribute有些类似java中的annotation,可以方便地在类成员中做修饰/限制作用. Demo: class ss { public stat BsonDocument Itera ...
- linux笔记:用户和用户组管理-用户配置文件
用户信息文件(/etc/passwd): 影子文件(/etc/shadow) 组信息文件(/etc/group)和组密码文件(/etc/gshadow):
- Easy UI
首先去Easy UI官网下载离线包 导入要用的js模块 <!DOCTYPE html> <html> <head lang="en"> < ...
- Java 编程入门(词汇表)
抽象类(abstract class):抽象类不能创建对象,主要用来创建子类.Java中的抽象类使用 abstract 修饰符定义. 抽象数据类型(abstract data type ADT):抽象 ...
- MySQL 入门知识点
参考网址:http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html 1.数值类数据列类型 数据列类型 存储空间 描述 TINYINT ...