bzoj 2809 左偏树\平衡树启发式合并
首先我们对于一颗树,要选取最多的节点使得代价和不超过m,那么我们可以对于每一个节点维护一个平衡树,平衡树维护代价以及代价的和,那么我们可以在logn的时间内求出这个子树最多选取的节点数,然后对于一个节点的平衡树我们可以由他的子节点启发式合并而来,时间复杂度nlog^2n。
这道题还可以用左偏树来解决,左偏树为一种可合并堆,合并,删除,插入都在logn内完成,那么这道题的时间复杂度还可以nlogn。
反思:我写的是左偏树的,手残把value打成cost了= =,查了半天。
/**************************************************************
Problem: 2809
User: BLADEVIL
Language: C++
Result: Accepted
Time:3604 ms
Memory:8060 kb
****************************************************************/
//By BLADEVIL
#include <cstdio>
#include <algorithm>
#define maxn 100010
#define LL long long
using namespace std;
int n,m,l;
int left[maxn],right[maxn];
int pre[maxn],other[maxn],last[maxn];
LL ans;
LL cost[maxn],value[maxn],size[maxn],sum[maxn];
void connect(int x,int y) {
pre[++l]=last[x];
last[x]=l;
other[l]=y;
}
int combine(int x,int y) {
if ((!x)||(!y)) return x+y;
if (cost[x]<cost[y]) swap(x,y);
right[x]=combine(right[x],y);
sum[x]=sum[left[x]]+sum[right[x]]+cost[x];
size[x]=size[left[x]]+size[right[x]]+;
return x;
}
int work(int x) {
sum[x]=cost[x]; size[x]=;
int rot=x;
for (int p=last[x];p;p=pre[p]) rot=combine(rot,work(other[p]));
while (sum[rot]>m) rot=combine(left[rot],right[rot]);
ans=max(ans,value[x]*size[rot]);
return rot;
}
int main() {
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) {
int x; scanf("%d%lld%lld",&x,&cost[i],&value[i]);
if (x) connect(x,i);
}
work();
printf("%lld\n",ans);
return ;
}
bzoj 2809 左偏树\平衡树启发式合并的更多相关文章
- BZOJ 4003 左偏树
思路: 用到了左偏树合并复杂度是logn的性质 一开始先BFS一遍 打标记的左偏树 //By SiriusRen #include <cstdio> #include <cstrin ...
- BZOJ 2333 左偏树 (写得我人生都崩溃了...)
思路: 高一神犇 竟然 问我这道题 我光荣地 看着题解(划掉) 写了一下午 QaQ multiset不能erase(一个值) 这样就把等于这个值 的数都erase掉了 (woc我一开始不 ...
- 面试经典算法:优先队列,最大堆,堆排序,左偏树Golang实现
堆排序 使用优先队列-最小/最大堆可实现. 优先队列 优先队列是一种能完成以下任务的队列:插入一个数值,取出最小的数值(获取数值,并且删除).优先队列可以用二叉树来实现,我们称这种为二叉堆. 最小堆 ...
- 【BZOJ4003】【JLOI2015】城池攻占(左偏树)
题面 题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi ...
- 左偏树自己的一点理解【hdu1512】【Monkey King】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=34693563 向大(hei)佬(e)势力学(di ...
- 洛谷$P4331\ [BOI2004]\ Sequence$ 数字序列 左偏树
正解:左偏树 解题报告: 传送门$QwQ$ 开始看到的时候$jio$得长得很像之前做的一个$dp$,,, 但是$dp$那题是说不严格这里是严格? 不难想到我们可以让$a_{i},b_{i}$同时减去$ ...
- YbtOJ#631-次短路径【左偏树,最短路】
正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/1 题目大意 给出\(n\)个点\(m\)条边的一张无向图,对于每个点\(i\)求不经过\(i ...
- BZOJ 2809: [Apio2012]dispatching(左偏树)
http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题意: 思路:最简单的想法就是枚举管理者,在其子树中从薪水低的开始选起,但是每个节点都这样处理 ...
- 【BZOJ 2809】2809: [Apio2012]dispatching (左偏树)
2809: [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Maste ...
随机推荐
- 可用于jquery animate()方法的css属性
* backgroundPosition * borderWidth * borderBottomWidth * borderLeftWidth * borderRightWidth * border ...
- 抽象类 C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C#添加本地打印机
class Program { static void Main(string[] args) { const string printerName = "Print to file&quo ...
- BZOJ 1263 整数划分(数学+高精度)
我们不妨考虑可以划分为实数的情况,设划分为x份实数,使得总乘积最大. 易得当每一份都相等时乘积最大.即 ans=(n/x)^x. 现在只需要求出这个函数取得最大值的时候x的取值了. 两边取对数,则有l ...
- Android 4.0源码结构
Android 4.0 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等 ...
- CentOS 配置无线网络,开启wifi
背景:一台老笔记本安装CentOS7.x,最小安装模式,安装后无法开启wifi 1.先用NetworkManager包的nmcli命令检查网卡,发现无线网卡wlo1信息里有个错误plugin miss ...
- PCA误差
我们知道,PCA是用于对数据做降维的,我们一般用PCA把m维的数据降到k维(k < m). 那么问题来了,k取值多少才合适呢? PCA误差 PCA的原理是,为了将数据从n维降低到k维,需要找到k ...
- spring+springMVC+mybatis较全
1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On- ...
- PHP导出excel,无乱码
php部分 header("Content-type:application/octet-stream"); header("Accept-Ranges:bytes&qu ...
- snmp实用篇
简单网络管理协议(SNMP)是 TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案:由于 SNMP的简单性,在Int ...