[Apio2012]dispatching

时间限制: 1 Sec  内存限制: 128 MB

题目描述

在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为 Master。除了 Master以外,每名忍者都有且仅有一个上级。为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送。现在你要招募一批忍者,并把它们派遣给顾客。你需要为每个被派遣的忍者 支付一定的薪水,同时使得支付的薪水总额不超过你的预算。另外,为了发送指令,你需要选择一名忍者作为管理者,要求这个管理者可以向所有被派遣的忍者 发送指令,在发送指令时,任何忍者(不管是否被派遣)都可以作为消息的传递 人。管理者自己可以被派遣,也可以不被派遣。当然,如果管理者没有被排遣,就不需要支付管理者的薪水。你的目标是在预算内使顾客的满意度最大。这里定义顾客的满意度为派遣的忍者总数乘以管理者的领导力水平,其中每个忍者的领导力水平也是一定的。写一个程序,给定每一个忍者 i的上级 Bi,薪水Ci,领导力L i,以及支付给忍者们的薪水总预算 M,输出在预算内满足上述要求时顾客满意度的最大值。
1  ≤N ≤ 100,000 忍者的个数;
1  ≤M ≤ 1,000,000,000 薪水总预算;
0  ≤Bi < i  忍者的上级的编号;
1  ≤Ci ≤ M  忍者的薪水;

1  ≤Li ≤ 1,000,000,000 忍者的领导力水平。

输入

从标准输入读入数据。
第一行包含两个整数 N M,其中 N表示忍者的个数,M表示薪水的总预算。
接下来 N行描述忍者们的上级、薪水以及领导力。其中的第 i 行包含三个整 Bi , C i , L i分别表示第i个忍者的上级,薪水以及领导力。Master满足B i = 0并且每一个忍者的老板的编号一定小于自己的编号 Bi < i

输出

输出一个数,表示在预算内顾客的满意度的最大值。

样例输入

5 4
0 3 3
1 3 5
2 2 2
1 2 4
2 3 1

样例输出

6

提示

如果我们选择编号为 1的忍者作为管理者并且派遣第三个和第四个忍者,薪水总和为 4,没有超过总预算4。因为派遣了2个忍者并且管理者的领导力为3,用户的满意度为 2 ,是可以得到的用户满意度的最大值。

题解:

这是一道左偏树的裸题,既可以用深搜,也可以用广搜,深搜简单,广搜直观,小编用的是广搜。

建立左偏树。(用大根堆,因为只跟忍者的个数有关,所以被删除的工资越大越好)

从叶子借点向上广搜,不断合并节点,然后不断删除堆顶直到总工资小于m。

然后广搜入队的时候特判一下,一面忽略叶子节点的可能性。

一下是AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<ctime>
using namespace std;
int n,m;
int father[],cnt[];
long long sum[],num[],skill[];
queue<int>mem;
struct node
{
long long key;
int dist;
node *l,*r;
int ldist(){return l?l->dist:;}
int rdist(){return r?r->dist:;}
} man[];
node *pos=man,*root[];
int read()
{
int ans=,f=;
char i=getchar();
while(i<''||i>''){if(i=='-')f=-;i=getchar();}
while(i>=''&&i<=''){ans=ans*+i-'';i=getchar();}
return ans*f;
}
node* merge(node* a,node* b)
{
if(!a||!b)return a?a:b;
if(a->key<b->key)swap(a,b);
a->r=merge(a->r,b);
if(a->ldist()<a->rdist())swap(a->l,a->r);
a->dist=a->rdist()+;
return a;
}
void delet(int x)
{
num[x]--;
sum[x]-=root[x]->key;
root[x]=merge(root[x]->l,root[x]->r);
}
int main()
{
int i,j;
long long ans=;
n=read();
m=read();
for(i=; i<=n; i++)
{
father[i]=read();
cnt[father[i]]++;
scanf("%lld",&sum[i]);
pos++;
pos->key=sum[i];
pos->l=pos->r=NULL;
num[i]=;
root[i]=pos;
scanf("%lld",&skill[i]);
}
for(i=; i<=n; i++)
if(!cnt[i])
{
mem.push(i);
ans=max(ans,skill[i]);
}
while(!mem.empty())
{
int x=mem.front();
mem.pop();
int fa=father[x];
root[fa]=merge(root[fa],root[x]);
cnt[fa]--;
sum[fa]+=sum[x];
num[fa]+=num[x];
if(!cnt[fa])
{
while(sum[fa]>m)delet(fa);
ans=max(ans,skill[fa]*num[fa]);
if(father[fa])mem.push(fa);
}
}
cout<<ans<<endl;
return ;
}

[Apio2012]dispatching的更多相关文章

  1. 【bzoj2809】[Apio2012]dispatching 左偏树

    2016-05-31  15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...

  2. BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )

    枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...

  3. bzoj2809 [Apio2012]dispatching(左偏树)

    [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 M ...

  4. [Apio2012]dispatching 主席树做法

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

  5. 【BZOJ2809】[Apio2012]dispatching 可并堆

    [BZOJ2809][Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 M ...

  6. bzoj 2809: [Apio2012]dispatching -- 可并堆

    2809: [Apio2012]dispatching Time Limit: 10 Sec  Memory Limit: 128 MB Description 在一个忍者的帮派里,一些忍者们被选中派 ...

  7. 【BZOJ 2809】2809: [Apio2012]dispatching (左偏树)

    2809: [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Maste ...

  8. 2809: [Apio2012]dispatching

    2809: [Apio2012]dispatching Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3102  Solved: 1641 [Sub ...

  9. BZOJ2809: [Apio2012]dispatching

    传送门 主席树经典题. 首先把树搞出来,然后搞出来DFS序.然后离散化点权,在DFS序上建立主席树. 对于每个点对应的区间,查找对应的区间最大的点数即可. //BZOJ2809 //by Cydiat ...

随机推荐

  1. 零售业山重水复,全景行柳暗花明——VR全景智慧城市

    对今天的中国来说,寻找经济转型的突破口,寻找经济权力的新霸主,零售业应该当仁不让. 零售业正在经历一场脱胎换骨的改造.一方面零售额达到前所未有的水平,另一方面,传统零售商也面临诸多挑战,其中之一,便是 ...

  2. Android studio 打开别人的工程

    Android Studio正确打开项目只需要两步,或者说找到两个文件进行简单的修改就好,最好在打开之前进行修改 (1)gradle-wrapper.properities,在项目下按照如下路径可以找 ...

  3. Swift 中 String 取下标及性能问题

    Swift 中 String 取下标及性能问题 取下标 String String 用 String.Index 取下标(subscript)得到 Character,String.Index 要从 ...

  4. Hadoop2.6.1中的Reducer实现

    正在考虑怎么方便上传图片 1.Partitioner其是一个抽象类,只有一个抽象方法.其作用是对Reducer产生的中间结果进行分片,以方便将同一分组的数据交给同一个Reducer处理 2.类的继承结 ...

  5. IPv6,AppStore 审核不是唯一选择它的原因

    为什么选择 IPv6?因为更快的 InternetIPv6 更快有两个原因.第一点,像 iOS.MacOS.Chrome 和 Firefox 这样的主流的操作系统或者浏览器,在它们使用 IPv4 连接 ...

  6. Spring Cloud 声明式服务调用 Feign

    一.简介 在上一篇中,我们介绍注册中心Eureka,但是没有服务注册和服务调用,服务注册和服务调用本来应该在上一章就应该给出例子的,但是我觉得还是和Feign一起讲比较好,因为在实际项目中,都是使用声 ...

  7. 《JAVA与模式》之简单工厂模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...

  8. 开涛spring3(7.3) - 对JDBC的支持 之 7.3 关系数据库操作对象化

    7.3.1  概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复 ...

  9. 五、 创建连接串连接本地数据库(ASP.NET MVC5 系列)

    1. 创建连接串连接本地SQLServer数据库 上节讲到MovieDBContext类,这个类的作用是连接数据库并将Movie对象迁移到数据库记录中.不过你会问一个问题:如何知道这个对象将连接哪个数 ...

  10. SVN版本控制系统搭建(+结合http服务)

    .zise { background: #CCCCFF; color: white; text-align: center } .fense { color: #FFCCCC; text-align: ...