题目传送门

$Chat$

哈哈哈我xj用dfs序乱搞竟然炸出了66分....(其实还是数据水,逃)


$Sol$

首先我们应该知道,一个人他自己的满意度与他子树所有节点的领导力是无关的,一个人的满意度受它子树影响只通过选子树的数量来体现。

因为薪水预算是有限的,而我们又想获得更多的子树,那么我们肯定想要子树薪水排名前$k$个的(满足不超过总预算)。我的暴力想法是每次排序来维护的,其实这里正解是用左偏树来维护的。(嘤我只写过左偏树板子而且不太理解)。

我们每次都尽量把一个节点的所有子树都选上,然后每次用可并堆找出花费最大的点干掉(即维护大根堆),直到满足条件。为什么要用可并堆呢?在这个树形结构中,根(最大的)被干掉后,我们要把它的左儿子和右儿子合并。这个时候用左偏树再合适不过了。

上述算法的实现用到了树形dp(递归)的思想。


$Code$

因为没写过非板子的左偏树题目...所以这里写清楚些。$fa[]$记录的是这个点的根。开始时这个节点的根等于它自己。$merge$函数返回的也是根。

 #include<cstdio>
#include<algorithm>
#define maxn 100090 using namespace std;
typedef long long ll; int n,m,tot;
int head[maxn],fa[maxn],dis[maxn],lch[maxn],rch[maxn],size[maxn];
ll ans,v[maxn],val[maxn],sum[maxn];
int T[maxn][];
struct node{
int to,next;
}edge[maxn*]; void add(int x,int y)
{
edge[++tot].to=y;
edge[tot].next=head[x];
head[x]=tot;
} int merge(int x,int y)
{
if(x==||y==) return x+y;
if(v[x]<v[y]||(v[x]==v[y]&&x>y)) swap(x,y);
rch[x]=merge(rch[x],y);
fa[rch[x]]=y;
if(dis[lch[x]]<dis[rch[x]]) swap(lch[x],rch[x]);
dis[x]=dis[rch[x]]+;
return x;
} void dfs(int u,int f)
{
fa[u]=u;size[u]=;sum[u]=v[u];
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==f) continue;
dfs(v,u);
size[u]+=size[v];sum[u]+=sum[v];
fa[u]=merge(fa[u],fa[v]);
}
while(sum[u]>m&&size[u])
{
sum[u]-=v[fa[u]];
size[u]--;
fa[u]=merge(lch[fa[u]],rch[fa[u]]);
}
ans=max(ans,1ll*size[u]*val[u]);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
int x=;scanf("%d",&x);
add(i,x);add(x,i);
scanf("%lld%lld",&v[i],&val[i]);
}
dfs(,);
printf("%lld",ans);
return ;
}

Luogu P1552 [APIO2012]派遣【左偏树】By cellur925的更多相关文章

  1. 洛谷P1552 [APIO2012] 派遣 [左偏树,树形DP]

    题目传送门 忍者 Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都 ...

  2. [洛谷P1552] [APIO2012]派遣(左偏树)

    这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者 ...

  3. [APIO2012]派遣 左偏树

    P1552 [APIO2012]派遣 题面 考虑枚举每个节点作为管理者,计算所获得的满意程度以更新答案.对于每个节点的计算,贪心,维护一个大根堆,每次弹出薪水最大的人.这里注意,一旦一个人被弹出,那么 ...

  4. [luogu P1552] [APIO2012]派遣

    [luogu P1552] [APIO2012]派遣 题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除 ...

  5. 洛谷 - P1552 - 派遣 - 左偏树 - 并查集

    首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. ...

  6. P1552 派遣 左偏树

    左偏树就是一个应该用堆维护的区间,然后需要进行合并操作而发明的算法,其实这个算法没什么难的,和树剖有点像,维护几个数值,然后递归回来的时候就可以修改. 题干: 题目背景 在一个忍者的帮派里,一些忍者们 ...

  7. Luogu P1552 [APIO2012]派遣 主席树

    题目链接 Click Here 这个题好像大多数人用的都是左偏树啊?这里我来贡献一发主席树的解法. 把题目中的问题抽象出来,其实就是询问每一个点的子树中,工资前\(tot_i\)大的点,使它们的和满足 ...

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

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

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

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

随机推荐

  1. SQL server 数据库

    SQL server 的开启关闭和暂停 数据库表格

  2. 解决编译twrp3.0.3遇到的问题

    1. 问题: ninja: error: '/home/jessie/OMNI/out/target/product/m1/obj/SHARED_LIBRARIES/libcryptfs_hw_int ...

  3. VUE清除组件内部定时器

    定时器如果不手动清除,只会在离开当前页面或者F5刷新后才会清除.由于vue项目是SPA应用,离开当前组件后并不会清除定时器,所以需要我们手动去清除定时器.但当我们将清除定时器clearInterval ...

  4. js对象的属性问题

    ES6之前js的对象的属性只能是字符串, <html> <head> <script type="text/javascript"> var a ...

  5. iOS开发 - App程序启动原理

    Info.plist和pch文件的作用 建立一个project后,会在Supporting files目录下看到一个"project名-Info.plist"的文件,该文件对pro ...

  6. mt7620 wifi driver

    <*> Ralink RT2860 802.11n AP support [*] LED Support [*] WSC (WiFi Simple Config) [*] WSC 2.0( ...

  7. __sizeof__()

    https://bugs.python.org/issue2898 https://bugs.python.org/file10353/footprint.patch Index: Python/sy ...

  8. iOS UI控件之间的关系图

  9. 秒懂单链表及其反转(reverse)

    什么是链表,这种数据结构是由一组Node组成的,这群Node一起表示了一个序列.链表是最普通,最简单的数据结构(物理地址不连续),它是实现其他数据结构如stack, queue等的基础. 链表比起数组 ...

  10. POJ1426 Find The Multiple —— BFS

    题目链接:http://poj.org/problem?id=1426 Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Tota ...