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