[Apio2012]dispatching
[Apio2012]dispatching
时间限制: 1 Sec 内存限制: 128 MB
题目描述
1 ≤Li ≤ 1,000,000,000 忍者的领导力水平。
输入
输出
输出一个数,表示在预算内顾客的满意度的最大值。
样例输入
样例输出
提示
如果我们选择编号为 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的更多相关文章
- 【bzoj2809】[Apio2012]dispatching 左偏树
2016-05-31 15:56:57 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 直观的思想是当领导力确定时,尽量选择薪水少的- ...
- BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )
枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...
- bzoj2809 [Apio2012]dispatching(左偏树)
[Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 M ...
- [Apio2012]dispatching 主席树做法
bzoj 2809: [Apio2012]dispatching http://www.lydsy.com/JudgeOnline/problem.php?id=2809 Description 在一 ...
- 【BZOJ2809】[Apio2012]dispatching 可并堆
[BZOJ2809][Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 M ...
- bzoj 2809: [Apio2012]dispatching -- 可并堆
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MB Description 在一个忍者的帮派里,一些忍者们被选中派 ...
- 【BZOJ 2809】2809: [Apio2012]dispatching (左偏树)
2809: [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Maste ...
- 2809: [Apio2012]dispatching
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3102 Solved: 1641 [Sub ...
- BZOJ2809: [Apio2012]dispatching
传送门 主席树经典题. 首先把树搞出来,然后搞出来DFS序.然后离散化点权,在DFS序上建立主席树. 对于每个点对应的区间,查找对应的区间最大的点数即可. //BZOJ2809 //by Cydiat ...
随机推荐
- 'k1': 大于66的所有值, 'k2': 小于66的所有值
#!/usr/bin/env python # -*- coding: utf-8 -*- #有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值 ...
- 大数相加a+b
#include<stdio.h>#include<string.h>#define MAX 1000void Add(char *a,char *b,char *result ...
- PHP自定义函数
啊哈
- iis7 安装laravel5.4环境
laravel版本: Laravel5.4IIS版本:IIS7站点配置就不详细说啦,大家网上可以搜一坨很多的配置方法啦哈直接上图: 由于IIS没有像Apache.htaccess文件,创建一个Web. ...
- R语言通过loess去除某个变量对数据的影响
当我们想研究不同sample的某个变量A之间的差异时,往往会因为其它一些变量B对该变量的固有影响,而影响不同sample变量A的比较,这个时候需要对sample变量A进行标准化之后才能进行比较.标 ...
- Iterator(es6)
1.任何数据结构只要部署了Iterator接口(本质是一个指针对象),也就是部署了Symbol.iterator属性,便可以完成遍历操作:数组原生就具备Iterator接口,就可以用for...of遍 ...
- C语言之循环结构
程序结构: 顺序结构 条件结构(分支结构) if结构,if-else结构 ,多重if分支结构,switch结构 循环结构:做重复的事情 while循环,do..while循环和for循环. 写循环结构 ...
- Vulkan Tutorial 09 图像视图
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 使用任何的VkImage,包括在交换链或者渲染管线中的,我们都需要创建VkImage ...
- #414 Div2 C
#414 Div2 C 题意 两个人每个人都有一串字母序列,他们要替换一个长度为 n 包含问号的新序列,他们每次可以使用自己序列中的字母代替新序列的问号(使用自己序列中的字母后那个字母就会消失),第一 ...
- python-广度优先搜索
广度优先搜索 下面我们来来BFS算法策略: 比如:我们要从双子峰---->金门大桥,最短路径如何? 我们利用广度优先搜索来一步步求解,注意广度优先搜索在于的关键在于"广",也 ...