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. [转帖]网络协议封封封之Panabit配置文档

    原帖地址:http://myhat.blog.51cto.com/391263/322378

  2. android-文件存储的使用

    Android提供了5种方式存储数据: 1.使用SharedPreferences存储数据: 2.文件存储数据: 3.SQLite数据库存储数据: 4.使用ContentProvider存储数据: 5 ...

  3. svn客户端命令

    记几个常用的命令. 首次拉仓库时,先要进行检出(url可以带端口号): svn checkout http://svn.example.com:9834/repos svn checkout file ...

  4. IC卡复位应答ATR解析

    输入的是ATR,通过解析输出TA.TB.TC.TD的信息. 似乎没有容错处理,~~~~(>_<)~~~~ #include <stdio.h> #define TA_BIT ( ...

  5. jQuery中的Ajax几种请求方法

    在网上查的几种Ajax的请求的方法: jQuery 确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯.废话少说,直接进入正题,我 ...

  6. CSS样式--实际开发总结

    1.   div 嵌套,子div中内容超出范围可以设置: display:inline-block; overflow:auto 即可让子div中出现滚轴 2.   让div中内容垂直方向居中 设置: ...

  7. 模块化开发--sea.js

    当你的网站开发越来越复杂的时候,会经常遇到一下问题吗?1.冲突2.性能3.依赖如果在多人开发或者是复杂的开发过程中会经常遇到这些问 题,就可以用模块化开发来解决.以上问题是如何产生的?1.冲突:如果你 ...

  8. linux之基础命令大全

    作为测试人员对linux系统命令必须非常熟悉,尤其对于高级测试工程师,从事性能方面测试,就更需要对linux命令了如指掌,这里只对部分常用命令做解释,想深入学习请关注后续文章 ctrl z  终止当前 ...

  9. ✡ leetcode 172. Factorial Trailing Zeroes 阶乘中的结尾0个数--------- java

    Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...

  10. 自学 PHP,如何不走弯路?

    1.一本好书至关重要.如果这本书的知识非常深入,那么还是不要看了.对初学者来说只能是打击.因为很多东西都看不懂.一本知识较为浅显,并且说明非常详细,但是能让你上手的基础知识又非常完善的书籍就非常好.( ...