【BZOJ3252】攻略【闵可夫斯基和】【堆启发式合并】
题意:给一棵 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)=maxi=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(nlog2n)\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】攻略【闵可夫斯基和】【堆启发式合并】相关推荐
- BZOJ3252: 攻略
BZOJ3252: 攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...
- P7011-[CERC2013]Escape【堆,启发式合并】
正题 题目链接:https://www.luogu.com.cn/problem/P7011 题目大意 给出nnn个点的一棵树,从一出发,要走到 ttt.初始时权值为000,每个节点有一个权值wiw_ ...
- bzoj3252 攻略
http://www.elijahqi.win/2018/03/15/bzoj3252/ Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他 ...
- bzoj3252攻略(线段树+dfs序)或者(树链剖分+dfs)
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1341 Solved: 642 [Submit][Status][Discuss] ...
- BZOJ3252攻略——长链剖分+贪心
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...
- [bzoj3252]攻略
题目描述 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某些场景可以通过不同的选择支到达 ...
- bzoj3252 攻略 dfs序+线段树
题目传送门 题目大意:给出一棵树,1为根节点,每个节点都有权值,每个叶子节点都是一个游戏的结局,选择k个游戏结局,使得权值总和最大,同一个节点不会被重复计算. 思路:这道题最关键的是要想到一个性质,就 ...
- bzoj3252攻略 贪心+dfs序+线段树
题目链接:戳这里 3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 605 Solved: 255 [Submit][Status] ...
- bzoj3252攻略(线段树+dfs序)
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 562 Solved: 238 [Submit][Status][Discuss] ...
- dfs序+线段树 BZOJ3252 攻略
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 496 Solved: 211 [Submit][Status][Discuss] ...
最新文章
- 光伏行业需理性看待低价中标 市场竞争是必然选择
- @RequestBody注解分析
- java设计模式——工厂方法模式
- 关于VUE项目地图开发中大量点标记绘制一些总结
- 交换机跟计算机系统有关系,网速跟交换机有关系吗
- 一个让程序员男友记住一辈子的 IntelliJ IDEA 插件!
- 东方财富代码选股_东方证券APP评测:智能选股方面优秀 投顾服务缺失
- Android的LitePal开源数据库框架学习笔记
- android盒子多个DLNA冲突,说说DLNA、AirPlay 、Miracast那点事
- CMS系统评测,主流自助建站系统比较排名
- 801机械设计2017题签
- 怎么用计算机名称共享打印机设置,如何共享打印机设置教程
- 南洋生活,聊聊新加坡的房地产
- 如何去除Matlab里面的ans?
- 程序员菜谱3中粥做法
- JAVA微商城_O2O微门店SAAS系统
- S700K五机牵引转辙设备简介组成及道岔转换设备故障分析【铁路信号技术专栏】—转载自微信公众号铁路信号技术交流
- 连共享打印机问题汇总
- Eclipse创建java Web项目工程
- 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群
热门文章
- 轮子一定要是圆的吗?
- 当你女朋友向你索吻的时候。。
- 因为没钱买衣服,我女朋友不要我了......
- 世界头号毒枭古斯曼被捕,全因被内部IT男出卖!
- 在c语言中,字符串topt65的长度是,谭浩强c__程序设计第13章.ppt
- android mvvm流程图,MVVM框架模式详解
- 计算机bq,BQ24721部分翻译
- openlayers地图旋转_OpenLayers的使用---- 一个完全免费开源的地图JS库
- JAVA跟MYSQL数据库交互_【编写Java程序实现与Mysql数据库的连接,并交互性的实现简单查询,删除,修改,排序,显示等操作】...
- PHP防QQ列表右划,react native 实现类似QQ的侧滑列表效果