题意:给一棵 nnn 个点的有点权的树,你需要找 kkk 条根到叶子的路径,使得路径并集的权值和最大。

n≤2×105n\leq 2\times 10^5n≤2×105

其实就是个贪心,只是从这个角度更自然一点(

先有个显然的 dp,设 f(u,k)f(u,k)f(u,k) 为从 uuu 往下找 kkk 条链覆盖的权值最大值。

f′(u,k)=max⁡i=0k{f(u,i)+f(v,k−i)}+[k>0]auf'(u,k)=\max_{i=0}^k \{f(u,i)+f(v,k-i)\}+[k>0]a_uf′(u,k)=i=0maxk​{f(u,i)+f(v,k−i)}+[k>0]au​

发现是个闵可夫斯基和的形式。

然后往这个方向考虑,不管怎么理解都能看出这是个凸壳。

所以合并的时候继承叶子最多的儿子(或者直接继承子树最大的也可以)的凸包,其他的暴力做闵可夫斯基和。可以用堆来维护斜率也就是差分,然后暴力插入。最后把第一项 +au+a_u+au​ 即可。

复杂度是 O(nlog⁡2n)\Omicron(n\log ^2n)O(nlog2n),但常数很小。

脑抽写了个平衡树,我是 SB

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#include <cstdlib>
#define MAXN 200005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
typedef long long ll;
int ch[MAXN][2],key[MAXN],tot;
ll val[MAXN];
inline int newnode(int v){return val[++tot]=v,key[tot]=rand(),tot;}
int merge(int x,int y)
{if (!x||!y) return x|y;if (key[x]<key[y]) return ch[x][1]=merge(ch[x][1],y),x;return ch[y][0]=merge(x,ch[y][0]),y;
}
void split(int x,ll v,int& l,int& r)
{if (!x) return (void)(l=r=0);if (val[x]>v) split(ch[x][1],v,l,r),ch[x][1]=l,l=x;else split(ch[x][0],v,l,r),ch[x][0]=r,r=x;
}
int getfir(int& x)
{if (!ch[x][0]) {int t=x;x=ch[x][1],ch[t][1]=0;return t;}return getfir(ch[x][0]);
}
inline void insert(int& x,int v)
{int l,r;split(x,val[v],l,r);x=merge(merge(l,v),r);
}
vector<int> e[MAXN];
int a[MAXN],rt[MAXN],lev[MAXN],son[MAXN];
void dfs(int u)
{if (e[u].empty()) return (void)(lev[u]=1);for (int i=0;i<(int)e[u].size();i++){dfs(e[u][i]);if (lev[e[u][i]]>lev[son[u]]) son[u]=e[u][i];lev[u]+=lev[e[u][i]];}
}
void Dfs(int u)
{if (son[u]) Dfs(son[u]),rt[u]=rt[son[u]];else return (void)(rt[u]=newnode(a[u]));for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=son[u]){Dfs(e[u][i]);while (rt[e[u][i]]) insert(rt[u],getfir(rt[e[u][i]]));}int p=getfir(rt[u]);val[p]+=a[u];rt[u]=merge(p,rt[u]);
}
int main()
{int n,k;n=read(),k=read();for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<n;i++){int u,v;u=read(),v=read();e[u].push_back(v);}dfs(1),Dfs(1);ll ans=0;while (k--) ans+=val[getfir(rt[1])];cout<<ans;return 0;
}

【BZOJ3252】攻略【闵可夫斯基和】【堆启发式合并】相关推荐

  1. BZOJ3252: 攻略

    BZOJ3252: 攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...

  2. P7011-[CERC2013]Escape【堆,启发式合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P7011 题目大意 给出nnn个点的一棵树,从一出发,要走到 ttt.初始时权值为000,每个节点有一个权值wiw_ ...

  3. bzoj3252 攻略

    http://www.elijahqi.win/2018/03/15/bzoj3252/ ‎ Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他 ...

  4. bzoj3252攻略(线段树+dfs序)或者(树链剖分+dfs)

    3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1341 Solved: 642 [Submit][Status][Discuss] ...

  5. BZOJ3252攻略——长链剖分+贪心

    题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...

  6. [bzoj3252]攻略

    题目描述 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某些场景可以通过不同的选择支到达 ...

  7. bzoj3252 攻略 dfs序+线段树

    题目传送门 题目大意:给出一棵树,1为根节点,每个节点都有权值,每个叶子节点都是一个游戏的结局,选择k个游戏结局,使得权值总和最大,同一个节点不会被重复计算. 思路:这道题最关键的是要想到一个性质,就 ...

  8. bzoj3252攻略 贪心+dfs序+线段树

    题目链接:戳这里 3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 605  Solved: 255 [Submit][Status] ...

  9. bzoj3252攻略(线段树+dfs序)

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 562  Solved: 238 [Submit][Status][Discuss] ...

  10. dfs序+线段树 BZOJ3252 攻略

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 496  Solved: 211 [Submit][Status][Discuss] ...

最新文章

  1. 光伏行业需理性看待低价中标 市场竞争是必然选择
  2. @RequestBody注解分析
  3. java设计模式——工厂方法模式
  4. 关于VUE项目地图开发中大量点标记绘制一些总结
  5. 交换机跟计算机系统有关系,网速跟交换机有关系吗
  6. 一个让程序员男友记住一辈子的 IntelliJ IDEA 插件!
  7. 东方财富代码选股_东方证券APP评测:智能选股方面优秀 投顾服务缺失
  8. Android的LitePal开源数据库框架学习笔记
  9. android盒子多个DLNA冲突,说说DLNA、AirPlay 、Miracast那点事
  10. CMS系统评测,主流自助建站系统比较排名
  11. 801机械设计2017题签
  12. 怎么用计算机名称共享打印机设置,如何共享打印机设置教程
  13. 南洋生活,聊聊新加坡的房地产
  14. 如何去除Matlab里面的ans?
  15. 程序员菜谱3中粥做法
  16. JAVA微商城_O2O微门店SAAS系统
  17. S700K五机牵引转辙设备简介组成及道岔转换设备故障分析【铁路信号技术专栏】—转载自微信公众号铁路信号技术交流
  18. 连共享打印机问题汇总
  19. Eclipse创建java Web项目工程
  20. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

热门文章

  1. 轮子一定要是圆的吗?
  2. 当你女朋友向你索吻的时候。。
  3. 因为没钱买衣服,我女朋友不要我了......
  4. 世界头号毒枭古斯曼被捕,全因被内部IT男出卖!
  5. 在c语言中,字符串topt65的长度是,谭浩强c__程序设计第13章.ppt
  6. android mvvm流程图,MVVM框架模式详解
  7. 计算机bq,BQ24721部分翻译
  8. openlayers地图旋转_OpenLayers的使用---- 一个完全免费开源的地图JS库
  9. JAVA跟MYSQL数据库交互_【编写Java程序实现与Mysql数据库的连接,并交互性的实现简单查询,删除,修改,排序,显示等操作】...
  10. PHP防QQ列表右划,react native 实现类似QQ的侧滑列表效果