[洛谷P1552][APIO2012]派遣】的更多相关文章

题目传送门 忍者 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送.现在你要招募一批忍者,并把它们派遣给顾客.你需要为每个被派遣的忍者 支付一定的薪水,同时使得支付的薪水总额不超过你的预算.另外,为了发送指令,你需要选择一名忍者作为管理…
传送门 貌似是个可并堆的模板题,笔者懒得写左偏堆了,直接随机堆水过.实际上这题就是维护一个可合并的大根堆一直从叶子合并到根,如果堆中所有数的和超过了上限就一直弹直到所有数的和不超过上限为止,最后对于当前的子树,这样剩下的堆中的元素个数一定是最多的,然后直接统计答案就行了. 代码: #include<bits/stdc++.h> #define N 100005 #define ll long long using namespace std; inline ll read(){ ll ans=…
题目大意:有一棵$n$个点的树,和一个费用$m$,每个点有一个费用和价值,请选一个点,再从它的子树中选取若干个点,使得那个点的价值乘上选的点的个数最大,要求选的点费用总和小于等于$m$ 题解:树形$dp$,贪心可得选的点一定是费用最少的几个点,可以用可并堆,大根堆,若总费用大于$m$就把堆顶弹掉,直到小于等于$m$,更新答案 卡点:无 C++ Code: #include <algorithm> #include <cstdio> #define maxn 100010 int h…
传送门 做这题的时候现学了一波左偏树2333(好吧其实是当初打完板子就给忘了) 不难发现肯定是选子树里权值最小的点且选得越多越好 但如果在每一个点维护一个小根堆,我们得一直找知道权值大于m为止,时间会炸 于是我们对每一个点维护一个大根堆,一直pop直到堆里总的权值小于m为止,此时堆里的元素个数就是总共的人数 不难发现每一个人最多只会被pop一次,于是时间复杂度就是$O(n\ logn)$ 左偏树合并写错了竟然还能有67分…… //minamoto #include<bits/stdc++.h>…
这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者作为管理者时,最优解一定是去除掉所有的较大工资的忍者,剩下的忍者符合费用要求时,答案是管理者的管理能力×剩下的忍者数量.并且我们可以推出,当一棵子数中的一棵小子树中去掉了一个忍者,那么那个忍者一定不会对当前的子树有答案贡献. Part 2 解题思想 都理解了题目了,就很清楚了,我们在dfs过程中记录…
洛谷1552 [APIO2012]派遣 原题链接 题解 luogu上被刷到了省选/NOI- ...不至于吧 这题似乎有很多办法乱搞? 对于一个点,如果他当管理者,那选的肯定是他子树中薪水最少的k个,而且这k个薪水之和<=m k又要最大 可以维护n个可并堆(代码里是斜堆(不会左偏树)(平衡树启发式合并也行???)) 每次dfs所有儿子,搞完以后再把儿子的堆与键值为自己薪水的节点全部merge起来,然后一直弹最大的弹到和<=m为止,然后用堆的size*L更新答案. 用大根堆维护. Code //…
[luogu P1552] [APIO2012]派遣 题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的领导力,所有与他们工作相关的指令总是由上级发送给他的直接下属,而不允许通过其他的方式发送. 现在你要招募一批忍者,并把它们派遣给顾客.你需要为每个被派遣的忍者支付一定的薪水,同时使得支付的薪水总额不超过你的预算.另外,为了发送指…
http://www.codevs.cn/problem/1763/ https://www.lydsy.com/JudgeOnline/problem.php?id=2809 https://www.luogu.org/problemnew/show/P1552 http://210.33.19.101/problem/2182 用线段树合并,值域线段树维护可重集合,线段树每个节点维护一个sum表示当前集合中,所有在范围[l,r](这个点的值域区间)内的数的和:每个点从其子节点合并:查询就根据…
根据题意,我们不难发现忍者之间的关系是树形结构. 发现答案的统计只是在该节点的子树中,因此我们考虑通过树形\(DP\)来解决问题. 从叶子节点开始,从下往上考虑,因为一个节点的最优答案只与他的领导力和在子树中选了几个点有关,与选哪些点无关,所以我们要最大化选点的个数. 贪心策略即为尽可能的多选点,当选出的点的薪水超过预算时,删去当前选出的点中薪水最大的点,通过这样的策略来保证我们能选出最多的点. 通过可并堆(左偏树)来实现,同时维护一些信息,选出点的薪水总和\(sum\),选出点的个数\(siz…
首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. 考虑到原本就是从别的博客过来的,先天知道了这是左偏树. 那么就是每次合并若干个忍者吗? 首先一开始每个忍者可以自己派遣自己出去,贡献就是1x自己的领导力水平. 然后逐个合并每个忍者和自己的直接领导,合并之后就保证了自己的直接领导一定有被选中!新的贡献就是领导的领导力水平x目前堆最小的若干个元素?…