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. NueGet设置package Source

    package Source为:http://packages.nuget.org/v1/FeedService.svc/ 最新的地址(2015-4-10):https://www.nuget.org ...

  2. linux驱动之LCD

    LCD程序步骤:1. 分配一个fb_info 2. 设置 3. 硬件相关的操作4. 注册 register_framebuffer 5.入口函数 6.出口函数 #include <linux/s ...

  3. Android SDK Manager中不显示未下载的api解决方案

    Android SDK 在线更新镜像服务器资源用户评价:  / 14 Android SDK 在线更新镜像服务器资源:大连东软信息学院镜像服务器地址:http://mirrors.neusoft.ed ...

  4. 项目里的jquery.min.js错误

    项目里的jquery.min.js报一系列 - Missing semicolon - Missing semicolon - Missing semicolon - Missing semicolo ...

  5. 服务器使用recast navigation

    在3D MMO或者其他类型的游戏中,通常需要进行寻路处理,地图针对寻路有多种方案,比如划分格子,凸多边形等,本篇介绍一种比较常用的navigation mesh的方式来进行寻路.不过整套navmesh ...

  6. 外边距(padding)重叠的及解决办法

    两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大的值.如果出现负边界,则在最大的正边界中减去绝对值最大的负边界.如果没有正边界,则从零中减去绝对值最大的负边界.注意:相邻的盒 ...

  7. Python::re 模块 -- 在Python中使用正则表达式

    前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...

  8. java中的日期操作Calendar和Date

    1. Calendar转Date Calendar calendar = Calendar.getInstance(); Date date = calendar.getTime(); 2. Date ...

  9. laypage

    <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> < ...

  10. Emgu学习手册

    作为opencv的c#封装库.emgu可以满足基本的图像处理功能,经过测试,效果还可以,主要用于windows窗体应用程序的开发,或者wpf,你可以用来做ocr,也可以用来做人脸识别或者可以用来做定位 ...