D. Alyona and a tree

Problem Description:

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.

Input:

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.

Output:

Print n integers — the i-th of these numbers should be equal to the number of vertices that the i-th vertex controls.

Sample Input:

5

2 5 1 4 6

1 7

1 1

3 5

3 6

Sample Output:

1 0 1 0 0

这题是后补的,花了2 3天,最后问了黄菊苣,又看了前几的代码,才有点懂了 但也不错嘛,感受到了D题的难度

【题目链接】D. Alyona and a tree

【题目类型】图论+二分+dfs

&题意:

一颗树1~n,以1为节点,每个节点i都有一个对应的a[i]值,问每个节点可以控制多少个子节点 并输出

控制的定义:dis(v,u)<=a[u]

dis(v,u)的定义:从v到u的边上的权值之和

&题解:

首先要存图,下面是前几的大神代码,他用的是g存的图。

存完图,dfs扫一遍,depth[]存的是权值前缀和,前缀和存在单调性,这时就可以想到用二分了。(构造前缀和,以便用二分)

--1---

-2-3--

--4-5-

上面是样例的树,假如我dfs到了第4个节点,那么我就二分4 3 1这个路径的前缀和,找到能控制4的最大区间,更新这个区间,之后继续dfs第5个节点,这时修改前缀和的数组,也就是path数组,把4 pop_back掉,把5 push进去,这就可以二分5 3 1这条路了。

主算法就这样,今天比较晚了,明天写一下试试。

【时间复杂度】O(\(nlogn\))

&代码:

#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
typedef long long ll;
typedef pair<int, int> pii;
#define fast_io ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define freopen(x) freopen(x".in", "r", stdin), freopen (x".out", "w", stdout);
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define sz(x) int(x.size())
#define all(x) x.begin(), x.end()
const int N = (int) 1e6;
vector<pair<ll, int> > path;
vector<vector<pair<int, ll> > > g(N);
ll ans[N], a[N], depth[N]; void dfs(int v, int p = -1) {
ans[v] = 1;
int idx = lower_bound(all(path), mp(depth[v] - a[v], -1)) - path.begin();
--idx;
if (idx >= 0) ans[path[idx].se]--;
path.pb(mp(depth[v], v));
for (auto x : g[v]) {
int to = x.fi;
if (to == p) continue;
ll len = x.se;
depth[to] = depth[v] + len;
dfs(to, v);
ans[v] += ans[to];
}
path.pop_back();
}
int main() {
fast_io;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i < n; i++) {
int p;
ll w;
cin >> p >> w;
g[i + 1].pb(mp(p, w));
g[p].pb(mp(i + 1, w));
}
dfs(1);
for (int i = 1; i <= n; i++)
cout << ans[i] - 1 << " ";
return 0;
}

Codeforces Round #381 (Div. 2)D. Alyona and a tree(树+二分+dfs)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. Codeforces Round #358 (Div. 2) C. Alyona and the Tree 水题

    C. Alyona and the Tree 题目连接: http://www.codeforces.com/contest/682/problem/C Description Alyona deci ...

  5. Codeforces Round #358 (Div. 2) C. Alyona and the Tree dfs

    C. Alyona and the Tree time limit per test 1 second memory limit per test 256 megabytes input standa ...

  6. Codeforces Round #358 (Div. 2)——C. Alyona and the Tree(树的DFS+逆向思维)

    C. Alyona and the Tree time limit per test 1 second memory limit per test 256 megabytes input standa ...

  7. Codeforces Round #358 (Div. 2) C. Alyona and the Tree

    C. Alyona and the Tree time limit per test 1 second memory limit per test 256 megabytes input standa ...

  8. Codeforces Round #381 (Div. 1) A. Alyona and mex 构造

    A. Alyona and mex 题目连接: http://codeforces.com/contest/739/problem/A Description Alyona's mother want ...

  9. Codeforces Round #381 (Div. 2)C. Alyona and mex(思维)

    C. Alyona and mex Problem Description: Alyona's mother wants to present an array of n non-negative i ...

随机推荐

  1. 第三个Sprint冲刺github 与最终 github

    链接:https://github.com/22shaojiawen/the-third-sprint-project

  2. android 瀑布流效果 保存地址

    http://tech.ddvip.com/2013-09/1379785198203013_2.html

  3. 深入理解javascript中实现面向对象编程方法

    介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解: 1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是 ...

  4. (原创)VM中的CentOS6.4中安装CloudStack6.3①

    CloudStack是一个功能强大.UI友好的开源云(IaaS)计算解决方案.自Ctrix将CloudStack捐献给 apache 后,一直持续高速发展,其社区活跃度已经渐渐赶上风头一时无两的另一开 ...

  5. PHP--------TP中的ajax请求

    PHP--------TP中的ajax请求 以jQuery中的ajax为例: (1)引入jQuery 通过模板替换表示路径,我们可以自定义模板替换变量(在config中定义) /*自定义模板替换标签* ...

  6. Python实例2

    2.企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:20万到40万之间 ...

  7. Linux Command Line 笔记(1)

    Yunduan CUI graphical user interfaces make easy tasks easy, while command line interfaces make diffi ...

  8. [C# WPF]MoeEroViewer Developing Log

    [C# WPF]MoeEroViewer Developing Log 1st - Base Document run on Https://github.com/Amarillys/MoeEroVi ...

  9. Java BIO、NIO、AIO 学习(转)

    转自 http://stevex.blog.51cto.com/4300375/1284437 先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Ja ...

  10. 王爽 <<汇编 语言>> 13.6 BIOS中断例程应用

    ;名称:ILOVEU程序 ;使用BIOS提供的中断例程 assume cs:code code segment main: ;显示背景22*80 ;dh中放行号 ;dl中放列号 bibi: push ...