题目分析:

yy一下就知道了,合并用可并堆少个log。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 102000;
 5
 6 int n,m;
 7 int b[maxn],c[maxn],l[maxn],sz[maxn];
 8 long long tot[maxn];
 9 int dis[maxn],val[maxn],ch[maxn][2],pts[maxn];
10 vector <int> g[maxn];
11 long long ans = 0;
12
13 int merge(int r1,int r2){
14     if(r1 == 0) return r2; if(r2 == 0) return r1;
15     if(val[r1] > val[r2]){
16     ch[r1][1] = merge(ch[r1][1],r2);
17     if(dis[ch[r1][0]] < dis[ch[r1][1]]) swap(ch[r1][0],ch[r1][1]);
18     if(ch[r1][1]) dis[r1] = dis[ch[r1][1]] + 1;
19     else dis[r1] = 0;
20     return r1;
21     }else{
22     ch[r2][1] = merge(r1,ch[r2][1]);
23     if(dis[ch[r2][0]] < dis[ch[r2][1]]) swap(ch[r2][0],ch[r2][1]);
24     if(ch[r2][1]) dis[r2] = dis[ch[r2][1]] + 1;
25     else dis[r2] = 0;
26     return r2;
27     }
28 }
29
30 void read(){
31     scanf("%d%d",&n,&m);
32     for(int i=1;i<=n;i++) scanf("%d%d%d",&b[i],&c[i],&l[i]);
33     for(int i=1;i<=n;i++){g[b[i]].push_back(i);}
34 }
35
36 void dfs(int now){
37     for(int i=0;i<g[now].size();i++){
38     dfs(g[now][i]);
39     sz[now] += sz[g[now][i]];
40     tot[now] += tot[g[now][i]];
41     }
42     sz[now]++; tot[now] += c[now];
43     for(int i=0;i<g[now].size();i++)pts[now]=merge(pts[now],pts[g[now][i]]);
44     while(tot[now] > m){
45     tot[now] -= val[pts[now]];sz[now]--;
46     pts[now] = merge(ch[pts[now]][0],ch[pts[now]][1]);
47     }
48     ans = max(ans,1ll*l[now]*sz[now]);
49 }
50
51 void work(){
52     for(int i=1;i<=n;i++) pts[i] = i,val[i] = c[i];
53     dfs(g[0][0]);
54     printf("%lld",ans);
55 }
56
57 int main(){
58     read();
59     work();
60     return 0;
61 }

转载于:https://www.cnblogs.com/Menhera/p/9558209.html

BZOJ2809 dispatching 【可并堆】相关推荐

  1. BZOJ2809:[Apio2012]dispatching——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题面复制于:https://www.luogu.org/problemnew/show/155 ...

  2. [Apio2012]dispatching 主席树做法

    bzoj 2809: [Apio2012]dispatching http://www.lydsy.com/JudgeOnline/problem.php?id=2809 Description 在一 ...

  3. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  4. Java堆和栈的基本理解

    Java 堆和栈的区别 参考背景: 堆内存:用来存放由new创建的对象和数组: 栈内存:存放基本类型的变量,对象的引用变量: 堆存放的原因:由于在堆中创建对象(或数组)后,可在栈中定义一个特殊变量,让 ...

  5. 堆叠式传感器架构带来先进的视觉功能

    堆叠式传感器架构带来先进的视觉功能 Stacked sensor architecture brings advanced vision capabilities 巴黎-巴黎Prophesee公司是神 ...

  6. java栈、堆、方法区

    1.java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方 2.堆区 存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) ...

  7. 【转】堆栈和托管堆 c#

    原文地址:http://blog.csdn.net/baoxuetianxia/archive/2008/11/04/3218913.aspx 首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处 ...

  8. linux内核和cpu指令集,Linux之父:Intel别浪费时间在AVX512这类指令集、多堆核心才是正道...

    原标题:Linux之父:Intel别浪费时间在AVX512这类指令集.多堆核心才是正道 在最近一次邮件交流中,Linux之父Linus Torvalds对Intel的处理器战略表达意见. 他谈到&qu ...

  9. 大根堆的删除c语言,二叉堆(一)之 C语言详解

    本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...

最新文章

  1. JAVscript对象
  2. 西安网络推广教大家如何正确解决处理网站死链
  3. python学起来难吗-Python入门学习难吗,新手如何学习
  4. 科大星云诗社动态20210828
  5. boost::movelib::unique_ptr相关的测试程序
  6. PYG教程【五】链路预测
  7. flexible.js淘宝移动端rem自适应用法
  8. 鲲鹏凌云,并行科技Paramon通过华为云鲲鹏云服务兼容性认证
  9. 模型集成 | 14款常规机器学习 + 加权平均模型融合
  10. (转)遇到重复的Maven项目初始配置,就要创建自己的Maven Archetype
  11. 自学编程、玩 vlog,90 后程序员们的冠军之路
  12. 前程无忧解密 + 推送
  13. STC15F104W 使用 315/433 MHz 超再生模块发送/接收数据
  14. 数据分析方法(3)之AARRR模型
  15. 卡耐基人性的弱点目录
  16. 网格布局每个网格都能放置一个组件_教你打造完美网站页面布局
  17. 18650电池充电方式和修复办法
  18. 如何从小白起步成为百万博主|配音运营工具必不可少
  19. 攻防对抗:如何巧妙复现360添加受信任文件
  20. 就是我mac安装了虚拟机,装了win10,然后发现在mac系统桌面也会有win系统桌面的工具快捷键图标,如果删除mac桌面的快捷键图标,那么win10桌面的图标也消失了,我百度查的方法都不行。我想知道

热门文章

  1. drf 解析器,响应器,路由控制
  2. GoldenGate Logdump基本使用
  3. E2017E0605-hm
  4. C++的文艺复兴: Why C++? 王者归来
  5. 关于Zend framework 里一段代码的疑问
  6. ubuntu find
  7. 可执行程序加载到内存的过程
  8. Windows平台下动态链接库的总结
  9. Linux Shell中各种分号和括号的用法总结
  10. 算力云服务器是干啥的,云服务器将成趋势计算力和安全性是考验