我们可以遍历得出每个节点到根节点的距离h,然后用可并堆进行维护。树形dp

我用的是pairing heap

 #include<cstdio>
#include<algorithm>
#include<queue>
using namespace std ; struct node {
long long value ;
node * brother ;
node * child ;
node ( const long long value ) : value ( value ) ,
brother ( ) , child ( ) {} ;
} ; node * merge ( node * a , node * b ) {
if ( a == ) return b ;
if ( b == ) return a ;
if ( a -> value < b -> value ) swap ( a , b ) ;
b -> brother = a -> child ;
a -> child = b ;
a -> brother = ;
return a ;
} node * pop ( node * a ) {
node * o = a -> child ;
delete a ;
if ( o == ) return ;
static queue < node * > q ;
while ( ! q . empty () ) q . pop () ;
while ( o ) {
q . push ( o ) ;
o = o -> brother ;
}
while ( q . size () > 1u ) {
node * a = q . front () ;
q . pop () ;
node * b = q . front () ;
q . pop () ;
q . push ( merge ( a , b ) ) ;
}
return q . front () ;
} const int MAXN = + ;
int pa [ MAXN ] ;
long long l [ MAXN ] ;
long long h [ MAXN ] ;
int size [ MAXN ] ;
int N ;
long long L ;
node * heap [ MAXN ] ; int main () {
scanf ( "%d%lld" , & N , & L ) ;
for ( int i = ; i <= N ; ++ i )
scanf ( "%d%lld" , & pa [ i ] , & l [ i ] ) ;
for ( int i = ; i <= N ; ++ i ) h [ i ] = l [ i ] + h [ pa [ i ] ] ;
for ( int i = ; i <= N ; ++ i ) {
heap [ i ] = new node ( h [ i ] ) ;
size [ i ] = ;
}
for ( int i = N ; i >= ; -- i ) {
while ( heap [ i ] -> value - h [ i ] > L ) {
heap [ i ] = pop ( heap [ i ] ) ;
size [ i ] -- ;
}
heap [ pa [ i ] ] = merge ( heap [ pa [ i ] ] , heap [ i ] ) ;
size [ pa [ i ] ] += size [ i ] ;
}
while ( heap [ ] -> value - h [ ] > L ) {
heap [ ] = pop ( heap [ ] ) ;
size [ ] -- ;
}
for ( int i = ; i <= N ; ++ i )
printf ( "%d\n" , size [ i ] ) ;
return ;
}

bzoj3011 可并堆的更多相关文章

  1. 【BZOJ3011】[Usaco2012 Dec]Running Away From the Barn 可并堆

    [BZOJ3011][Usaco2012 Dec]Running Away From the Barn Description It's milking time at Farmer John's f ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  4. 《徐徐道来话Java》:PriorityQueue和最小堆

    在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...

  5. 计算机程序的思维逻辑 (47) - 堆和PriorityQueue的应用

    45节介绍了堆的概念和算法,上节介绍了Java中堆的实现类PriorityQueue,PriorityQueue除了用作优先级队列,还可以用来解决一些别的问题,45节提到了如下两个应用: 求前K个最大 ...

  6. JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面 ...

  7. 数据结构:优先队列 基于堆实现(python版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu ''' #异常类 class HeapPriQueueError( ...

  8. 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序

    #!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...

  9. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

随机推荐

  1. checkbox的第三种状态--不确定状态

    视觉上,checkbox有三种状态:checked.unchecked.indeterminate(不确定的).看起来就像这样子:

  2. 高级同步器:信号量Semaphore

    引自:https://blog.csdn.net/Dason_yu/article/details/79734425 一.信号量一个计数信号量.从概念上讲,信号量维护了一个许可集.Semaphore经 ...

  3. JZOJ 5941. 乘

    Sample Input Sample Input1: 4 3 9 6 5 8 7 7 Sample Output Sample Output1: 0做法(转自JZOJ):考虑 a 是定值, 而 b ...

  4. python中string,time,datetime三者之间的转化

    这里time特指import time中的对象,datetime 特指from datetime import datetime中的对象,string指python自带的字符数据类型. 从使用的情况来 ...

  5. tarnado源码解析系列一

    目录 tarnado tarnado源码安装 tarnado测试程序 application类的解析 一. tarnado简介 最近在学习Python,无意间接触到的tarnado,感觉tarnado ...

  6. dz论坛Discuz_X3.4最新网站漏洞

    近期我们sinesafe安全部门审计discuz最新版的时候发现配置文件写入导致代码执行的问题.cms安装的时候一般会分为几个步骤去进行,其中有对配置文件config进行写入的步骤,当写入的时候未严格 ...

  7. POJ2739 Sum of Consecutive Prime Numbers 确定某个数以内的所有素数

    参考:https://www.cnblogs.com/baozou/articles/4481191.html #include <iostream> #include <cstdi ...

  8. 标记编码报错ValueError: bad input shape ()

    <Python机器学习经典实例>2.9小节中,想自己动手实践汽车特征评估质量,所以需要对数据进行预处理,其中代码有把字符串标记编码为对应的数字,如下代码 input_data = ['vh ...

  9. python2.7练习小例子(八)

        8):题目:输出 9*9 乘法口诀表.     程序分析:分行与列考虑,共9行9列,i控制行,j控制列.     程序源代码: #!/usr/bin/python # -*- coding: ...

  10. Ehcache缓存实例

    一:目录 EhCache 简介 Hello World 示例 Spring 整合 Dummy CacheManager 的配置和作用 二: 简介 1. 基本介绍 EhCache 是一个纯Java的进程 ...