【左偏树】BZOJ2809-[APIO2012]dispatching
【题目大意】
在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为 Master。除了 Master以外,每名忍者都有且仅有一个上级。为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送。现在你要招募一批忍者,并把它们派遣给顾客。你需要为每个被派遣的忍者 支付一定的薪水,同时使得支付的薪水总额不超过你的预算。另外,为了发送指令,你需要选择一名忍者作为管理者,要求这个管理者可以向所有被派遣的忍者 发送指令,在发送指令时,任何忍者(不管是否被派遣)都可以作为消息的传递 人。管理者自己可以被派遣,也可以不被派遣。当然,如果管理者没有被排遣,就不需要支付管理者的薪水。你的目标是在预算内使顾客的满意度最大。这里定义顾客的满意度为派遣的忍者总数乘以管理者的领导力水平,其中每个忍者的领导力水平也是一定的。写一个程序,给定每一个忍者 i的上级 Bi,薪水Ci,领导力L i,以及支付给忍者们的薪水总预算 M,输出在预算内满足上述要求时顾客满意度的最大值。
【思路】
通过dfs,从下往上,每次合并堆,如果总的薪水大于预期值,就弹出堆顶(即薪水最高的那个),直到小于预期值即可,每次dfs都更新一下答案。
【错误点】
写在程序里面了!比较的关键字是cost不是sum!!!!!!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int MAXN=+;
struct node
{
ll cost,key,sum;
int size,dis,lson,rson;
}ltree[MAXN];
int n,master;
ll m,ans=-;
vector<int> E[MAXN]; void build(int x,int fa,ll salary,ll leading)
{
ltree[x].cost=ltree[x].sum=salary;
ltree[x].key=leading;
ltree[x].size=(x==)?:;
ltree[x].lson=ltree[x].rson=;
ltree[x].dis=(x==)?-:;
} void pushup(int x)
{
int l=ltree[x].lson,r=ltree[x].rson;
ltree[x].sum=ltree[x].cost+ltree[l].sum+ltree[r].sum;
ltree[x].size=+ltree[l].size+ltree[r].size;
} int merge(int x,int y)
{
if (x==) return y;
if (y==) return x;
if (ltree[x].cost<ltree[y].cost) swap(x,y);
/*这里比较大小是cost之间,而不是sum之间……检查了一个下午才发现!!!!!!*/
ltree[x].rson=merge(ltree[x].rson,y);
int &l=ltree[x].lson,&r=ltree[x].rson;
if (ltree[l].dis<ltree[r].dis) swap(l,r);
if (r==) ltree[x].dis=;
else ltree[x].dis=ltree[r].dis+;
pushup(x);
return x;
} int del(int rt)
{
int l=ltree[rt].lson;
int r=ltree[rt].rson;
ltree[rt].dis=ltree[rt].lson=ltree[rt].rson=;
return merge(l,r);
} void init()
{
scanf("%d",&n);
scanf("%lld",&m);
for (int i=;i<=n;i++)
{
int b;
long long c,l;
scanf("%d%lld%lld",&b,&c,&l);
if (b==) master=i;
E[b].push_back(i);
build(i,b,c,l);
}
build(,,,);
} int dfs(int u)
{
int rt=u;
for (int i=;i<E[u].size();i++)
{
int to=E[u][i];
rt=merge(rt,dfs(to));
}
while (ltree[rt].sum>m)
{
ltree[rt].sum-=ltree[rt].cost;
ltree[rt].size--;
rt=del(rt);
}
ans=max(ans,(ll)ltree[rt].size*(ll)ltree[u].key);
return rt;
} void print_ans()
{
printf("%lld",ans);
} int main()
{
//freopen("dispatching.in","r",stdin);
//freopen("dispatching.out","w",stdout);
init();
dfs(master);
print_ans();
return ;
}
【左偏树】BZOJ2809-[APIO2012]dispatching的更多相关文章
- 【左偏树】[APIO2012]派遣
题意可真的是有毒 第一眼树形背包可做?(反正我没用树形背包打过,边上巨佬打的背包似乎没拿分) 后来发现可以贪心搞,我们先把一个节点所有的儿子都取进去,之后不行的话再从大的开始拿走就好了 问题就变成了了 ...
- 【bzoj2809】[Apio2012]dispatching 左偏树
2016-05-31 15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...
- bzoj2809 [Apio2012]dispatching(左偏树)
[Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 M ...
- 【BZOJ2809】【APIO2012】Dispatching(左偏树)
题面 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个 ...
- [BZOJ2809][Apio2012]dispatching(左偏树)
首先对于一个节点以及它的子树,它的最优方案显然是子树下选最小的几个 用左偏树维护出每棵子树最优方案的节点,记录答案 然后它的这棵树可以向上转移给父节点,将所有子节点的左偏树合并再维护就是父节点的最优方 ...
- 【BZOJ2809】[APIO2012] dispatching(左偏树例题)
点此看题面 大致题意: 有\(N\)名忍者,每名忍者有三个属性:上司\(B_i\),薪水\(C_i\)和领导力\(L_i\).你要选择一个忍者作为管理者,然后在所有被他管理的忍者中选择若干名忍者,使薪 ...
- 【bzoj2809】[Apio2012]dispatching (左偏树)
我们需要枚举根,然后从其子树内选尽量多的点,薪水不超过M,可是暴力复杂度不对.于是考虑自下而上合并树(开始每棵树内只有一个节点,就是自己) 每个树是一个堆,我们维护树的节点个数和薪水总和,合并时,不断 ...
- bzoj2809 [Apio2012]dispatching——左偏树(可并堆)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...
- 【BZOJ 2809】2809: [Apio2012]dispatching (左偏树)
2809: [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Maste ...
随机推荐
- fastjson解析服务端返回的数据
1.配置依赖 //fastjson api 'com.alibaba:fastjson:1.2.44' 2.设计服务端返回的数据 {},{},{}]} 3.编写bean类,特别注意,要和服务端返回的类 ...
- 对zip文件进行解压操作和对一个文件进行压缩操作
注意这里用的是apche下的zip package org.springframework.validation; import org.apache.tools.zip.ZipEntry; impo ...
- webstorm中把style的内容隐藏,如何把style的内容展开?
我们经常看到在webstorm中style的内容以...表示如下图所示,只有把光标移到上面时才会看到内容: 如何把上述的style的内容展开呢? 请按一下步骤操作: 第一步:File------> ...
- HBase并行写机制(mvcc)
HBase在保证高性能的同时,为用户提供了便于理解的一致性数据模型MVCC (Multiversion Concurrency Control),即多版本并发控制技术,把数据库的行锁与行的多个版本结合 ...
- 关于JAVA正则匹配空白字符的问题(全角空格与半角空格)
今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示“\u3000” ,这是什么? 这是全角空格!!! 查了一下 \s 不支持全角 1.& ...
- Jquery 获取checkbox的checked问题以及解决方案
转载自:http://www.cnblogs.com/-run/archive/2011/11/16/2251250.html 这个郁闷了,今天写这个功能的时候发现了问题,上网找了好多资料对照,更加纠 ...
- 利用java.lang.reflect.Constructor动态实例化对象
} } } } } Student t = co ...
- Bootstrap 栅格系统 理解与总结
Bootstrap 栅格系统 学习总结 Bootstrap框架是如今最流行的前端框架之一,Bootstrap功能强大,简单易学,很符合实际应用场景. 只是Bootstrap的内容较多,新手往往不能很快 ...
- 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]
Problem b Time Limit: 50 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...
- Bzoj4197 寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...