博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj3011 可并堆
阅读量:4519 次
发布时间:2019-06-08

本文共 3043 字,大约阅读时间需要 10 分钟。

[Usaco2012 Dec]Running Away From the Barn

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 467  Solved: 230
[][][]

Description

It's milking time at Farmer John's farm, but the cows have all run away! Farmer John needs to round them all up, and needs your help in the search. FJ's farm is a series of N (1 <= N <= 200,000) pastures numbered 1...N connected by N - 1 bidirectional paths. The barn is located at pasture 1, and it is possible to reach any pasture from the barn. FJ's cows were in their pastures this morning, but who knows where they ran to by now. FJ does know that the cows only run away from the barn, and they are too lazy to run a distance of more than L. For every pasture, FJ wants to know how many different pastures cows starting in that pasture could have ended up in. Note: 64-bit integers (int64 in Pascal, long long in C/C++ and long in Java) are needed to store the distance values. 

 

给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于l的点有多少个。

 

Input

 * Line 1: 2 integers, N and L (1 <= N <= 200,000, 1 <= L <= 10^18)

* Lines 2..N: The ith line contains two integers p_i and l_i. p_i (1 <= p_i < i) is the first pasture on the shortest path between pasture i and the barn, and l_i (1 <= l_i <= 10^12) is the length of that path.

Output

* Lines 1..N: One number per line, the number on line i is the number pastures that can be reached from pasture i by taking roads that lead strictly farther away from the barn (pasture 1) whose total length does not exceed L.

Sample Input

4 5
1 4
2 3
1 5

Sample Output

3
2
1
1
OUTPUT DETAILS: Cows from pasture 1 can hide at pastures 1, 2, and 4. Cows from pasture 2 can hide at pastures 2 and 3. Pasture 3 and 4 are as far from the barn as possible, and the cows can hide there.

HINT

 

因为L是确定的所就是可并堆维护就可以了,时间复杂度n log n

1 #include 
2 #include
3 using namespace std; 4 typedef long long ll; 5 int head[200010] , to[200010] , next[200010] , cnt , root[200010] , l[200010] , r[200010] , d[200010] , si[200010]; 6 ll m , len[200010] , v[200010]; 7 void add(int x , int y , ll z) 8 { 9 to[++cnt] = y;10 len[cnt] = z;11 next[cnt] = head[x];12 head[x] = cnt;13 }14 int merge(int x , int y)15 {16 if(!x) return y;17 if(!y) return x;18 if(v[x] < v[y]) swap(x , y);19 r[x] = merge(r[x] , y);20 if(d[l[x]] < d[r[x]]) swap(l[x] , r[x]);21 d[x] = d[r[x]] + 1;22 return x;23 }24 void dfs(int x)25 {26 int i;27 root[x] = x , si[x] = 1;28 for(i = head[x] ; i ; i = next[i])29 v[to[i]] = v[x] + len[i] , dfs(to[i]) , si[x] += si[to[i]] , root[x] = merge(root[x] , root[to[i]]);30 while(v[root[x]] > m + v[x])31 si[x] -- , root[x] = merge(l[root[x]] , r[root[x]]);32 }33 int main()34 {35 int n , i , x;36 ll z;37 scanf("%d%lld" , &n , &m);38 for(i = 2 ; i <= n ; i ++ )39 scanf("%d%lld" , &x , &z) , add(x , i , z);40 d[0] = -1;41 dfs(1);42 for(i = 1 ; i <= n ; i ++ )43 printf("%d\n" , si[i]);44 return 0;45 }

 

转载于:https://www.cnblogs.com/fengzhiyuan/p/8530737.html

你可能感兴趣的文章
Cocoa编程开发者手册
查看>>
C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节
查看>>
html5基础学习
查看>>
理工之 A+B Problem III
查看>>
SalesForce自定义按钮(javascript执行),点击按钮更新Filed
查看>>
Android中ViewPager实现滑动条及与Fragment结合的实例教程
查看>>
组织过程资产与事业环境因素
查看>>
学习和思考的要点
查看>>
16年收官之战,堪称完美,祝愿大家2017一举成名天下闻,虎啸龙吟展宏图
查看>>
使用jquery获取ul的li的值赋值
查看>>
Struts 2 标签
查看>>
关于 BFC 的一些实践例子
查看>>
201671010129 2016—2017—2 《Java程序设计》学习Java总结
查看>>
[每日一讲] Python系列:变量、内存管理与传递
查看>>
UI设计黄金法则
查看>>
HTML页面的重绘(repaint)和重流(reflow)
查看>>
将联系人导入到iPhone模拟器
查看>>
Android常用URI以及URI简介
查看>>
Postgresql 远程连接配置
查看>>
奇偶个数
查看>>