BZOJ2809 dispatching 【可并堆】
题目分析:
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 【可并堆】相关推荐
- BZOJ2809:[Apio2012]dispatching——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题面复制于:https://www.luogu.org/problemnew/show/155 ...
- [Apio2012]dispatching 主席树做法
bzoj 2809: [Apio2012]dispatching http://www.lydsy.com/JudgeOnline/problem.php?id=2809 Description 在一 ...
- 【学习笔记】浅谈短小可爱的左偏树(可并堆)
文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...
- Java堆和栈的基本理解
Java 堆和栈的区别 参考背景: 堆内存:用来存放由new创建的对象和数组: 栈内存:存放基本类型的变量,对象的引用变量: 堆存放的原因:由于在堆中创建对象(或数组)后,可在栈中定义一个特殊变量,让 ...
- 堆叠式传感器架构带来先进的视觉功能
堆叠式传感器架构带来先进的视觉功能 Stacked sensor architecture brings advanced vision capabilities 巴黎-巴黎Prophesee公司是神 ...
- java栈、堆、方法区
1.java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方 2.堆区 存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) ...
- 【转】堆栈和托管堆 c#
原文地址:http://blog.csdn.net/baoxuetianxia/archive/2008/11/04/3218913.aspx 首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处 ...
- linux内核和cpu指令集,Linux之父:Intel别浪费时间在AVX512这类指令集、多堆核心才是正道...
原标题:Linux之父:Intel别浪费时间在AVX512这类指令集.多堆核心才是正道 在最近一次邮件交流中,Linux之父Linus Torvalds对Intel的处理器战略表达意见. 他谈到&qu ...
- 大根堆的删除c语言,二叉堆(一)之 C语言详解
本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...
最新文章
- JAVscript对象
- 西安网络推广教大家如何正确解决处理网站死链
- python学起来难吗-Python入门学习难吗,新手如何学习
- 科大星云诗社动态20210828
- boost::movelib::unique_ptr相关的测试程序
- PYG教程【五】链路预测
- flexible.js淘宝移动端rem自适应用法
- 鲲鹏凌云,并行科技Paramon通过华为云鲲鹏云服务兼容性认证
- 模型集成 | 14款常规机器学习 + 加权平均模型融合
- (转)遇到重复的Maven项目初始配置,就要创建自己的Maven Archetype
- 自学编程、玩 vlog,90 后程序员们的冠军之路
- 前程无忧解密 + 推送
- STC15F104W 使用 315/433 MHz 超再生模块发送/接收数据
- 数据分析方法(3)之AARRR模型
- 卡耐基人性的弱点目录
- 网格布局每个网格都能放置一个组件_教你打造完美网站页面布局
- 18650电池充电方式和修复办法
- 如何从小白起步成为百万博主|配音运营工具必不可少
- 攻防对抗:如何巧妙复现360添加受信任文件
- 就是我mac安装了虚拟机,装了win10,然后发现在mac系统桌面也会有win系统桌面的工具快捷键图标,如果删除mac桌面的快捷键图标,那么win10桌面的图标也消失了,我百度查的方法都不行。我想知道