热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BZOJ2809[Apio2012]dispatching(斜堆+树形DP)

【题目链接】http:www.lydsy.comJudgeOnlineproblem.php?id2809【题目大意】给出一棵树,求出每个点有个权值,和

 

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2809

 

【题目大意】

  给出一棵树,求出每个点有个权值,和一个乘算值,请选取一棵子树,
  并在这个子树上选择一些节点,使得根节点的乘算值乘上选取的节点数价值最大,
  并且权值和不超过给定的限制

 

【题解】

  我们在树上做dfs,计算每个点作为子树根节点时候的价值,
  维护可并的权值大根堆,自下而上合并,当发现权值和大于限制的时候pop根节点即可。

 

【代码】

#include
#include
#include
using namespace std;
typedef long long LL;
const int N=100010;
int x,n,m,cnt,tot;
vector v[N];
LL ans,sum[N],size[N];
int C[N],L[N],root[N];
struct SHeap{int v[N],l[N],r[N];int merge(int x,int y){if(x==0||y==0)return x+y;if(v[x]}heap;
void dfs(int x){root[x]=++tot; heap.v[tot]=C[x];size[x]=1; sum[x]=C[x];for(int i=0;im){sum[x]-=heap.top(root[x]);heap.pop(root[x]);size[x]--;}ans=max(ans,size[x]*L[x]);
}
int main(){scanf("%d%d",&n,&m);for(int i&#61;1;i<&#61;n;i&#43;&#43;){scanf("%d%d%d",&x,&C[i],&L[i]);v[x].push_back(i);}dfs(1);printf("%lld\n",ans);return 0;
}


转:https://www.cnblogs.com/forever97/p/bzoj2809.html



推荐阅读
author-avatar
laknm_456
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有