dispatching(bzoj 2008)
Description
Input
Output
Sample Input
0 3 3
1 3 5
2 2 2
1 2 4
2 3 1
Sample Output
HINT
如果我们选择编号为 1的忍者作为管理者并且派遣第三个和第四个忍者,薪水总和为 4,没有超过总预算 4。因为派遣了 2 个忍者并且管理者的领导力为 3,用户的满意度为 2 ,是可以得到的用户满意度的最大值。
/*
这个题乍一看就是可并堆的合并,但是如果每次都合并全部节点的话,时间上是不够的,所以我们考虑,如果对于
某个子树构成的堆,里面的费用总和超过m的话,一些点是用不到的,并且在合并后也是用不到的,我们就可以把它删了。
*/
#include<cstdio>
#include<iostream>
#define N 100010
#define lon long long
using namespace std;
int head[N],n,m,root[N],mon[N],bil[N];lon ans;
struct node{
int l,r,dis,sz,v;lon sum;
};node heap[N];
struct Node{
int to,pre;
};Node e[N];
void add(int i,int u,int v){
e[i].to=v;
e[i].pre=head[u];
head[u]=i;
}
int merge(int a,int b){
if(!a||!b)return a+b;
if(heap[a].v<heap[b].v) swap(a,b);
heap[a].r=merge(heap[a].r,b);
if(heap[heap[a].l].dis<heap[heap[a].r].dis)
swap(heap[a].l,heap[a].r);
return a;
}
void dfs(int x){
heap[x].sum=(lon)mon[x];heap[x].sz=;root[x]=x;
for(int i=head[x];i;i=e[i].pre){
dfs(e[i].to);
heap[x].sz+=heap[e[i].to].sz;
heap[x].sum+=heap[e[i].to].sum;
root[x]=merge(root[x],root[e[i].to]);
}
while(heap[x].sum>(lon)m){
/*在这里犯了个错误,不是heap[root[x]].sum-=mon[root[x]],因为前面加的时候实在x上加的,
而合并的时候有没有转移,所以这里找就在x上减。*/
heap[x].sum-=mon[root[x]];heap[x].sz--;
root[x]=merge(heap[root[x]].l,heap[root[x]].r);
}
ans=max(ans,(lon)bil[x]*(lon)heap[x].sz);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int u;scanf("%d%d%d",&u,&mon[i],&bil[i]);
if(u)add(i,u,i);
heap[i].l=heap[i].r=heap[i].dis=;
heap[i].v=mon[i];
}
dfs();
cout<<ans;
return ;
}
dispatching(bzoj 2008)的更多相关文章
- BZOJ 1010 (HNOI 2008) 玩具装箱
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MB Submit: 12665 Solved: 5540 [Submit][S ...
- 晨跑(bzoj 1877)
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十 ...
- 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子
有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...
- 洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )
To 洛谷.1198 最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当 ...
- SHOI 2007 仙人掌图(BZOJ 1023)
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2564 Solved: 1062 Descrip ...
- 飞镖(bzoj 2335)
Description 飞镖是在欧洲颇为流行的一项运动.它的镖盘上分为20个扇形区域,分别标有1到20的分值,每个区域中有单倍.双倍和三倍的区域,打中对应的区域会得到分值乘以倍数所对应的分数.例如打中 ...
- 海拔(bzoj 2007)
Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个 正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1) ...
- 分裂游戏(bzoj 1188)
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- 弱题(bzoj 2510)
Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个 ...
随机推荐
- Android设计模式——MVP
一.什么是MVP MVP:全称 Model-View-Presenter. MVP框架由3部分组成:View层负责显示,Presenter层负责逻辑处理,Model层提供数据. View:负责绘制UI ...
- Android自定义zxing扫描界面的实现
首先,我们需要导入zxing的jar文件,其次复制所需要的资源文件以及放入自己需要添加的资源文件,复制出源码的必要相关类文件.对布局文件进行一定的修改,再修改CaptureActivity与Viewf ...
- IOS数组
/*******************************************************************************************NSArray ...
- SQLite运算符
SQLite运算符 SQLite的运算符是什么? 运算符是一个保留字或一个字符主要用于SQLite语句的WHERE子句来执行操作,如比较和算术运算. 操作符用于指定条件的SQLite语句和作为连词在一 ...
- 2019_京东JAVA实习生招聘机试第一题
题意抽象出来就是,求根节点的所有子节点中,以这些子节点为根的子树的最大节点数. 已有向图的方式来保存无向图,所以叶子结点i的eage[i].size()==1. import java.util.Ar ...
- Java面试题之HashSet 的实现原理?
HashSet 的实现原理?首先,我们需要知道它是Set的一个实现,所以保证了当中没有重复的元素.一方面Set中最重要的一个操作就是查找.而且通常我们会选择 HashSet来实现,因为它专门对快速查找 ...
- 什么是python 中的顶层代码?
在python语言中我们经常会听到顶层代码的说法,但是什么是顶层代码? 在python中,我们是以缩进来区分代码层次的,所以顶层代码指的是缩进为0个空格的代码. 看如下例子: PP = 3.14 de ...
- svn批处理语句
sc create SVNService binpath="O:\ProgramingSoftware\SuiVersion\bin\svnserve.exe --service -r E: ...
- Vickers Vane Pump Tips - Vane Pump Maintenance Note
The Vickers Vane Pump describes the matters needing attention in the maintenance of the vane p ...
- 《3+1团队》【Alpha】Scrum meeting 1
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 3+1团队 团队博客地址 https://home.cnblogs.com/u/3-1group ...