题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809

思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者;

当然它的子树中派遣出去的忍者越多越好,只要不超过预算;

所以需要能够合并子树情况的、能反映最大值节点的数据结构,也就是左偏树(可并堆);

所以对于每个点维护一个大根左偏树,当子树内总和超过预算时,就去掉大根堆堆顶,这样最优;

自己的第一棵左偏树!没想到相当简单呢。

左偏树的论文:https://wenku.baidu.com/view/029c886d1eb91a37f1115ce5.html

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const maxn=1e5+;
int n,m,head[maxn],ct,mas;
ll ans;
struct N{
int to,next;
N(int t=,int n=):to(t),next(n) {}
}edge[maxn<<];
struct T{
int ls,rs,siz,val,led,fa,dis;
ll sum;
}t[maxn];
int rd()
{
int ret=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return ret;
}
void add(int x,int y)
{
edge[++ct]=N(y,head[x]);head[x]=ct;
edge[++ct]=N(x,head[y]);head[y]=ct;
}
int merge(int x,int y)
{
if(!x)return y;
if(!y)return x;
if(t[x].val<t[y].val)swap(x,y);
t[x].rs=merge(t[x].rs,y);
int ls=t[x].ls,rs=t[x].rs;
t[x].sum=t[ls].sum+t[rs].sum+t[x].val;
t[x].siz=t[ls].siz+t[rs].siz+;
if(t[ls].dis<t[rs].dis)swap(t[x].ls,t[x].rs);//不是swap(ls,rs)
if(t[x].rs)t[x].dis=t[t[x].rs].dis+;//
else t[x].dis=;
return x;
}
int dfs(int x)
{
int rt=x;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(u==t[x].fa)continue;
rt=merge(rt,dfs(u));
}
// while(t[x].sum>m)
// {
// t[x].sum-=t[x].val;
// t[x].siz--;
// x=merge(ls,rs);
// }
while(t[rt].sum>m)rt=merge(t[rt].ls,t[rt].rs);
ans=max(ans,(ll)t[rt].siz*t[x].led);//不是 t[rt].led ,因为是选 x 作为管理者
return rt;
}
int main()
{
n=rd();m=rd();
for(int i=;i<=n;i++)
{
t[i].fa=rd(); t[i].val=rd(); t[i].led=rd();
t[i].siz=; t[i].sum=t[i].val;
add(t[i].fa,i);
if(t[i].fa==)mas=i;
}
dfs(mas);
printf("%lld",ans);
return ;
}

最新文章

  1. 【转】javascript面向对象编程
  2. jquery简单原则器(匹配偶数元素)
  3. linux下git的简单运用
  4. 解决debian中脚本无法使用source的问题
  5. 边工作边刷题:70天一遍leetcode: day 75-1
  6. magic矩阵 分类: 数学 2015-07-31 22:56 2人阅读 评论(0) 收藏
  7. 连接器|网络滤波连接器|电脑连接器|RJ45变压器-华联威电子有限公司
  8. 13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)
  9. cocos2d_x iconv转码
  10. Python读写Redis数据库
  11. memcached 实验论文
  12. 版本控制工具Vault v7.0更新内容曝光【慧都独家】
  13. 分布式版本控制系统Git-----7.Git 使用git rebase合并多次commit
  14. 自动加载U盘
  15. 协议端口号(protocol port number)
  16. remoteViews简介
  17. Hbase Scan的方法
  18. Linux用户配置文件(第二版)
  19. pyspider爬虫框架webui简介-爬取阿里招聘信息
  20. ☆ [ZJOI2006] 书架 「平衡树维护数列」

热门文章

  1. 【BFS+优先级队列】Rescue
  2. vue2.0 类淘宝不同屏幕适配及px与rem转换问题
  3. 关于如何使用Spring里@AliasFor注解进行注解的封装
  4. Python()- 面向对象三大特性----继承
  5. 导师高茂源:用CODEX创新方法破解西方创新“秘密”(转)
  6. ACM常用模板整理
  7. vijos 2035 奇数偶数与绚丽多彩的数
  8. EXTJS中整合tinymce的富文本编辑器,添加上传图片功能
  9. 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)
  10. 总结一下CSS定位