3252: 攻略

Time Limit: 10 Sec  Memory Limit: 128 MB

Description

题目简述:树版[k取方格数]
 
众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏。
今天他得到了一款新游戏《XX半岛》,这款游戏有n个场景(scene),某些场景可以通过不同的选择支到达其他场景。所有场景和选择支构成树状结构:开始游戏时在根节点(共通线),叶子节点为结局。每个场景有一个价值,现在桂马开启攻略之神模式,同时攻略k次该游戏,问他观赏到的场景的价值和最大是多少(同一场景观看多次是不能重复得到价值的)
“为什么你还没玩就知道每个场景的价值呢?”
“我已经看到结局了。”

Input

第一行两个正整数n,k
第二行n个正整数,表示每个场景的价值
以下n-1行,每行2个整数a,b,表示a场景有个选择支通向b场景(即a是b的父亲)
保证场景1为根节点

Output

 
输出一个整数表示答案

Sample Input

5 2
4 3 2 1 1
1 2
1 5
2 3
2 4

Sample Output

10

HINT

对于100%的数据,n<=200000,1<=场景价值<=2^31-1

Source

首先想到的是树链剖分,似乎复杂度不是很优qaq

然后bzoj的标签是 dfs序+线段树 似乎还是不会。。(似乎我太弱辣

orz了一下zgz的题解,随便搞搞长链剖分,每次贪心取最长链,一定是最优解,然后长链剖分保证了链不相交,和最长链的最优性

发现好有道理qaq,然后就是长链剖分的裸题  orz 长公主 https://www.zgz233.xyz/2017/10/12/bzoj-3252-%E6%94%BB%E7%95%A5/

这似乎是我真正意义上的第一道长链剖分 >_<

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1000000007
#define ll long long
#define N 200010
inline int rd()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int fro[N],to[N],lj[N],cnt;
void add(int a,int b){fro[++cnt]=lj[a];to[cnt]=b;lj[a]=cnt;}
int n,m,fa[N],rt;
ll a[N],mx[N];
int son[N];
priority_queue<ll>q;
void dfs1(int x,int f)
{
fa[x]=f;
for(int i=lj[x];i;i=fro[i])
{
dfs1(to[i],x);
if(mx[to[i]]>mx[son[x]]) son[x]=to[i];
}
mx[x]=a[x]+mx[son[x]];
}
void dfs2(int x,int tp)
{
if(x!=tp) a[x]+=a[fa[x]];
if(!son[x]){q.push(a[x]);return;}
dfs2(son[x],tp);
for(int i=lj[x];i;i=fro[i])
{
if(to[i]==son[x]) continue;
dfs2(to[i],to[i]);
}
}
ll ans;
bool ru[N];
int main()
{
n=rd();m=rd();
for(int i=;i<=n;i++) a[i]=rd();
for(int i=,x,y;i<n;i++)
{
x=rd();y=rd();
add(x,y);ru[y]=;
}
for(int i=;i<=n;i++) if(!ru[i]) rt=i;
dfs1(rt,);dfs2(rt,rt);
for(int i=;i<=m&&!q.empty();i++)
{
ans+=q.top();
q.pop();
}
printf("%lld\n",ans);
return ;
}

最新文章

  1. Meteor+AngularJS:超快速Web开发
  2. javascript判断给定字符串是否是回文
  3. SQL Server Management Studio 已停止工作 异常错误
  4. python 装饰器初步学习
  5. Unix/Linux 用户 nobody
  6. c#开发Mongo笔记第二篇
  7. SqlServer 在创建数据库时候指定的初始数据库大小是不能被收缩的
  8. C#实现时间戳转化
  9. Default Constructor的构造操作
  10. ADO.NET 数据库操作类
  11. 增强for循环用法
  12. 在线制作css动画——cssanimate
  13. Linux - 简明Shell编程10 - 管道(Pipe)
  14. poj 3683 2-sat建图+拓扑排序输出结果
  15. FineUIPro v5.2.0已发布(jQuery升级,自定义图标,日期控件)
  16. Solr中在使用过程中遇到的&quot;与&quot;和&quot;或&quot;的问题
  17. Android Studio中依赖引起错误
  18. css 简介 2
  19. 43-将javaweb项目部署到Linux服务器
  20. 面试题:get和post的本质区别

热门文章

  1. Linux下如何在进程中获取虚拟地址对应的物理地址【转】
  2. 使用数据库管理工具打开MySql
  3. No.3 selenium学习之路之鼠标&amp;键盘事件
  4. ASP.NET中Literal,只增加纯粹的内容,不附加产生html代码
  5. MySQL学习笔记:生成一个时间序列
  6. Effective STL 学习笔记 32 ~ 33
  7. VMware虚拟机的三种联网方法及原理(转)
  8. 使用Github的gh-pages分支展示一个页面
  9. 关于Fuzz——peach的学习
  10. 大家来探讨下,IRepository 应该怎么定义?