博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2809: [Apio2012]dispatching
阅读量:5167 次
发布时间:2019-06-13

本文共 1420 字,大约阅读时间需要 4 分钟。

传送门:

思路:很明显忍者之间的关系是一个树形结构

先自底向上枚举管理者x,那么根据题意,我们就要从x的子树中选择尽量多的忍者,且工资总和不超过m

用一个可并堆

到一个点x,就把它的儿子节点的可并堆并起来

显然优先选工资低的,那么维护大根堆,不停地删堆顶,直到工资满足预算即可

#include
#include
#include
#include
typedef long long ll;const int maxn=100010,maxm=100010;using namespace std;int C[maxn],L[maxn],siz[maxn],root[maxn],n,m,pre[maxm],now[maxn],son[maxm],tot;ll ans,sum[maxn];void read(int &x){ char ch; for (ch=getchar();!isdigit(ch);ch=getchar()); for (x=0;isdigit(ch);ch=getchar()) x=x*10+ch-'0';}void add(int a,int b){pre[++tot]=now[a],now[a]=tot,son[tot]=b;}struct Ltree{ int v[maxn],l[maxn],r[maxn],dis[maxn],tot; int newnode(int val){v[++tot]=val,l[tot]=r[tot]=dis[tot]=0;return tot;} int merge(int x,int y){ if (!x||!y) return x+y; if (v[x]
dis[l[x]]) swap(r[x],l[x]); dis[x]=dis[r[x]]+1; return x; } void pop(int &x){x=merge(l[x],r[x]);} int top(int x){return v[x];}}h;void dfs(int x){ root[x]=h.newnode(C[x]); siz[x]=1,sum[x]=C[x]; for (int y=now[x];y;y=pre[y]){ dfs(son[y]); sum[x]+=sum[son[y]]; siz[x]+=siz[son[y]]; root[x]=h.merge(root[x],root[son[y]]); } for (;sum[x]>m;) sum[x]-=h.top(root[x]),h.pop(root[x]),siz[x]--; ans=max(ans,1ll*L[x]*siz[x]);}int main(){ read(n),read(m); for (int i=1,x;i<=n;i++) read(x),read(C[i]),read(L[i]),add(x,i); dfs(1),printf("%lld\n",ans); return 0;}

转载于:https://www.cnblogs.com/thythy/p/5493634.html

你可能感兴趣的文章
开通博客
查看>>
day03_04 文件后缀及系统环境变量
查看>>
JAVASCRIPT和JSP计算闰年
查看>>
OracleDBConsole启动不了
查看>>
PhoneGap工具Cloud9 IDE介绍以及使用方法
查看>>
HTML5 File 对象
查看>>
顺序表和链式表总结
查看>>
vc6.0中的dsp,dsw,ncb,opt,clw,plg,aps等文件的简单说明
查看>>
深入浅出SharePoint2013——安装SharePoint2013
查看>>
回校前的流水账
查看>>
python2与python3的区别
查看>>
getJSON
查看>>
查询Sql Server数据库对象结构
查看>>
oracle字符串拆分
查看>>
【2019 1月集训 Day1】回文的后缀
查看>>
Cookie 读写类
查看>>
基于管道的popen和pclose函数
查看>>
hibernate(八) Hibernate检索策略(类级别,关联级别,批量检索)详解
查看>>
写一个TT模板自动生成spring.net下面的配置文件。
查看>>
背景透明
查看>>