bzoj3011 可并堆
2024-08-28 12:34:07
我们可以遍历得出每个节点到根节点的距离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 ;
}
最新文章
- asp.net ajax 调用后台方法
- SQL server 2014安装以及解决连接数据库失败问题
- LeetCode 231 Power of Two
- uva 10673 Play with Floor and Ceil
- UML 中关系详解以及在visio中的表示
- Nmon 监控 Linux 的系统性能
- .net设计模式之装饰模式
- BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏(搜索)
- webpack+vue-cil 中proxyTable配置接口地址代理
- SQL两列数据,行转列
- hprose for php
- [转]Centos7 fastdfs/nginx 安装与配置
- linux安装mysql和httpd
- IntelliJ IDEA 添加junit插件
- 【Unity】2.1 初识Unity编辑器
- Java精选笔记_文件上传与下载
- android中LayoutInflater.from(context).inflate的分析
- CSS: body{font-size: 62.5%;}设置原因
- MAJOR-MINOR-MKDEV
- day33 GIL锁 线程队列 线程池