Gym - 101147J Whistle's New Car 树上差分
15 seconds
512 megabytes
car.in
standard output
Whistle has bought a new car, which has an infinite fuel tank capacity.
He discovered an irregular country since it has n cities and there are exactly n - 1 roads between them, of course, all cities are connected. He is so much clever, he realized that the country is like a rooted tree of n nodes and node 1 is the root. Each city i has only one filling station by which he can fill his car's fuel tank in no more than Xi liter. Whistle liked the country very much, and he wants to know what the most attractive city in the country is. The attractiveness of the city i is defined by how much it’s reachable from other cities, in other words the attractiveness of city is the number of cities j that satisfies these condition:
- City j is in the subtree of city i (except for city i itself).
- Whistle will start at city j and will only fill his car’s fuel tank with Xj liters and never fill it again until he reach city i.
- Whistle should be able to reach city i with non-negative fuel.
He knows the length of every road and that 1 Km will take exactly 1 liter on any road.
As you know, Whistle is very clever, but he is not that good at programming, so he asked you to help him. He wants to know the attractiveness of each city, so that he can decide which city to live in.
The first line of input contains one integer T, the number of test cases.
The next line contains one integer (1 ≤ n ≤ 500, 000), The number of cities in the country.
The next line contains n integers (1 ≤ Xi ≤ 1, 000, 000, 000).
Each one of the next n - 1 line contains three integers A, B, C (1 ≤ A, B ≤ n and 1 ≤ C ≤ 1, 000, 000, 000), that means there is a road between city A and city B of length C.
For each test case, output a line containing n integers, the attractiveness of each city.
1
4
5 10 5 10
1 2 100
2 3 5
3 4 5
0 2 1 0
Large I/O files. Please consider using fast input/output methods.
设dis[i]表示从根节点1走到第 i个节点的路径长度。
那么任意的路径u-->v(前提是u是v的祖先,不然要用lca,这里不需要)可以表示为dis[v] - dis[u]
那么如果v能走回到u,则需要a[v] >= dis[v] - dis[u],即是dis[v] - a[v] <= dis[u],其中dis[v] - a[v]是一个确定值。
那么题意转换成,对于每一个节点u,有一个值dis[u],问其子树中,有多少个节点,满足dis[sonNode] - a[sonNode] <= dis[u]的。
这里可以用dfs序,然后用区间第k大的线段树或者分块、离线BIT之类的数据结构维护。
但是注意到dis[]是关于深度递增的,就是越走到下面,dis越大,也就是单调。
那么dfs的时候,用个vector记录一下路径长度和节点id。二分找到第一个祖先,使得满足dis[sonNode] - a[sonNode] <= dis[u]
那么可以知道ans[那个祖先节点 ---- 当前节点的爸爸],这条路径上的贡献都要加1
其实也就是打标记。
和一维差不多,L....R中加上1等价于sum[L] += 1, sum[R + 1] -= 1
这里一样,sum[当前节点的爸爸] += 1, sum[第一个满足的祖先的爸爸] -= 1
不能从上到下打标记,因为儿子数目不确定,而爸爸是确定的。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = + ;
struct Edge {
int u, v, tonext, len;
}e[maxn * ];
int first[maxn], num;
int a[maxn];
void addEdge(int u, int v, int w) {
++num;
e[num].u = u, e[num].v = v, e[num].len = w;
e[num].tonext = first[u];
first[u] = num;
}
int ans[maxn];
vector< pair<LL, int> > vc;
int vis[maxn], DFN;
void dfs(int cur, LL nowLen, int fa) {
ans[fa]++;
int pos = lower_bound(vc.begin(), vc.end(), make_pair(nowLen - a[cur], )) - vc.begin();
pos--; //去到第一个满足的的祖先的爸爸
if (pos >= ) {
ans[vc[pos].second]--;
}
vc.push_back(make_pair(nowLen, cur));
for (int i = first[cur]; i; i = e[i].tonext) {
int v = e[i].v;
if (v == fa) continue;
dfs(v, nowLen + e[i].len, cur);
ans[cur] += ans[v];
}
vc.pop_back();
}
void work() {
num = ;
++DFN;
memset(first, false, sizeof first);
memset(ans, , sizeof ans);
int n;
scanf("%d", &n);
for (int i = ; i <= n; ++i) cin >> a[i];
for (int i = ; i <= n - ; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w);
addEdge(v, u, w);
}
dfs(, , );
for (int i = ; i <= n; ++i) {
printf("%d ", ans[i]);
}
printf("\n");
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
freopen("car.in", "r", stdin);
int t;
scanf("%d", &t);
while (t--) work();
return ;
}
Gym - 101147J Whistle's New Car 树上差分的更多相关文章
- Codeforces Gym - 101147J Whistle's New Car
Discription Statements Whistle has bought a new car, which has an infinite fuel tank capacity. He di ...
- Gym 101147J Whistle's New Car(dfs)
https://vjudge.net/problem/Gym-101147J 题意: 有n个城市,每个城市有一个权值,表示在这个城市的加油站可以加多少油. 现在要计算每个城市i,有多少个城市j可以到达 ...
- 【树状数组】Gym - 101147J - Whistle's New Car
题意就是对每个点i,统计在其子树内(不含自身),且depj-depi<=xj的点有多少个. 把点分别按照dep-x和dep进行排序,离线处理, 每次把dep-x小于等于当前dep值的点插入树状数 ...
- 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 703 Solved: 461[Submit][Status] ...
- [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- 树上差分 (瞎bb) [树上差分][LCA]
做noip2015的运输计划写了好久好久写不出来 QwQ 于是先来瞎bb一下树上差分 混积分 树上差分有2个常用的功能: (1)记录从点i到i的父亲这条路径走过几次 (2)将每条路径(s,t ...
- [填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)
今天算是把LCA这个坑填上了一点点,又复习(其实是预习)了一下树上差分.其实普通的差分我还是会的,树上的嘛,也是懂原理的就是没怎么打过. 我们先来把树上差分能做到的看一下: 1.找所有路径公共覆盖的边 ...
- 【NOIP2016】【LCA】【树上差分】【史诗级难度】天天爱跑步
学弟不是说要出丧题吗>>所以我就研究了1天lca又研究了1天tj然后研究了一天天天爱跑步,终于写了出来.(最后的平均用时为240ms...比学弟快了1倍...) 题意:给你颗树,然后有m个 ...
- BZOJ_4238_电压_树上差分+dfs树
BZOJ_4238_电压_树上差分+dfs树 Description 你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)” ...
随机推荐
- Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析
前言 SQLite数据库操作在Android开发中非常常用 今天我将带大家全面了解关于SQLite数据库的操作(增.删.查.改) 目录 1. SQLite数据库介绍 SQLite是Android内置的 ...
- python学习笔记:第一天
1.经典程序测试:hello world 入门编程语言第一件事,先写hello world. #!/usr/bin/env python# -*- coding: UTF-8 -*- print(&q ...
- awk实现求和、平均、最大值和最小值的计算操作
0.准备和数据文件 比如有一个数据文件,只有一列(在之前可以通过各种手段过滤出只有数字这一列),比如操作的响应时间 Txt代码 490898 1189235 20212 1494270 14 ...
- TCP/IP 协议 —— ARP
通过 ARP 广播获得对方的 MAC 地址: 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议. 1. 特点 ARP ...
- redis-cluster的实例动态调整内存
当redis.conf中的最大内存配置为10G的时候,恰好程序已经写满了,但是物理主机是有内存的, 此时可以通过config set xxxx xxxx 来设置实例的内存大小,而不需要重启实例. 获取 ...
- android开发中怎么通过Log函数输出当前行号和当前函数名
public class Debug { public static int line(Exception e) { StackTraceElement[] trace = e.getStackTra ...
- CentOS7.0安装Ceph(jewel)及以上版本
背景 由于docker的Ceph插件rexray对Ceph版本有一定的要求,当Ceph版本为hammer (0.94.10)时,rexray无法成功创建rbd设备.CentOS 7及以上版本,默认安装 ...
- 你忘记的java的数据类型信息
java有8种基本数据类型 int long short byte float double char boolean: 三种情况造成数据溢出 无穷大,无穷小, NAN: 常量 声明为final的变量 ...
- jsoup解析xml某片段的问题
参考: http://blog.csdn.net/qy20115549/article/details/53556928 <tr> <td class='center'> &l ...
- Flutter实战视频-移动电商-09.首页_项目结构建立和获取数据
09.首页_项目结构建立和获取数据 在config下创建service_url.dart 用来配置我们后端接口的配置文件 一个变量存 接口地址,一个接口方法地址 所有后天请求数据的方法都放在这个文件夹 ...