3252: 攻略

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

dfs序+线段树

题解:

如标签所说,dfs序+线段树。

我们可以发现取法是符合贪心性质的,每次找到一个点,使得它到根的权值和最大。。

用dfs序保证子树是一段连续的区间,然后用线段树维护最大值。

在把链取走的时候注意更新其他点的权值和。。。。

#include<stdio.h>
#include<iostream>
using namespace std;
const int N=200005;
#define ll long long
#define p1 (p<<1)
#define p2 (p<<1|1)
int n,m,i,x,y,k,a[N],id[N],b[N],fa[N],h[N],mx[N],q[N];
int tot,head[N],to[N],Next[N];
ll ans,t[N<<2],add[N<<2],sum[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
void Add(int x,int y)
{
to[tot]=y;
Next[tot]=head[x];
head[x]=tot++;
}
inline void dfs(int x,int pre)
{
id[x]=mx[x]=++k;
b[k]=x;
for(int i=head[x];i!=-1;i=Next[i]) if(to[i]!=pre)
{
fa[to[i]]=x;
sum[to[i]]=sum[x]+a[to[i]];
dfs(to[i],x);
mx[x]=max(mx[x],mx[to[i]]);
}
}
void build(int l,int r,int p)
{
if(l==r)
{
t[p]=sum[b[l]];
q[p]=l;
return;
}
int mid=(l+r)>>1;
build(l,mid,p1);build(mid+1,r,p2);
if(t[p1]>t[p2]) t[p]=t[p1],q[p]=q[p1];else
t[p]=t[p2],q[p]=q[p2];
}
void update(int l,int r,int x,int y,int z,int p)
{
if(x<=l&&r<=y)
{
t[p]+=z;add[p]+=z;
return;
}
int mid=(l+r)>>1;
if(add[p]!=0)
{
add[p1]+=add[p];add[p2]+=add[p];
t[p1]+=add[p];t[p2]+=add[p];
add[p]=0;
}
if(x<=mid) update(l,mid,x,y,z,p1);
if(y>mid) update(mid+1,r,x,y,z,p2);
if(t[p1]>t[p2]) t[p]=t[p1],q[p]=q[p1];else
t[p]=t[p2],q[p]=q[p2];
}
int main()
{
read(n),read(m);
for(i=1;i<=n;i++) read(a[i]),head[i]=-1;
for(i=1;i<n;i++)
{
read(x),read(y);
Add(x,y);
}
sum[1]=a[1];
dfs(1,0);
build(1,n,1);
while(m--)
{
ans+=t[1];
for(i=b[q[1]];!h[i]&&i;i=fa[i])
{
h[i]=1;
update(1,n,id[i],mx[i],-a[i],1);
}
}
cout<<ans;
return 0;
}

  

bzoj 3252: 攻略的更多相关文章

  1. BZOJ[3252]攻略(长链剖分)

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

  2. bzoj 3252: 攻略 -- 长链剖分+贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Description 题目简述:树版[k取方格数]   众所周知,桂木桂马是攻略之神,开启攻略之神 ...

  3. 【贪心】 BZOJ 3252:攻略

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 90[Submit][Status][Discuss] De ...

  4. 【刷题】BZOJ 3252 攻略

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

  5. bzoj 3252 攻略 长链剖分思想+贪心

    攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 889  Solved: 423[Submit][Status][Discuss] Descrip ...

  6. BZOJ.3252.攻略(贪心 长链剖分/线段树)

    题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...

  7. BZOJ 3252: 攻略(思路题)

    传送门 解题思路 比较好想的一道思路题,结果有个地方没开\(long\) \(long\) \(wa\)了三次..其实就是模仿一下树链剖分,重新定义重儿子,一个点的重儿子为所有儿子中到叶节点权值最大的 ...

  8. [HYSBZ - 3252] 攻略

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

  9. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

随机推荐

  1. jmeter,测登录,要不要过滤掉JS,CSS等请求?感觉过滤掉了压出来的数据就不真实?

    首先,我们来明确下你的性能测试目的,你的目的是服务端的性能还是前端的性能.这两用目的所涉及到的测试场景和工具等方法是不一样的.1.我们先来谈谈服务端的性能.一般的web产品,像css, jpeg等这种 ...

  2. docker强制关闭命令

    删除容器: 优雅的关闭容器:docker stop  容器id/容器名字 强制关闭容器:docker kill 容器id/容器名字 删除镜像: docker rmi 容器id/容器名字

  3. Tomcat底层实现

    package myserver; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket; pu ...

  4. SQLSERVER中的非工作时间不得插入数据的触发器的实现

    create trigger trigger_nameon table_namefor insert,update,deleteasif (datepart(yy,getdate())%4=0 or ...

  5. Kotlin尝试

    Kotlin 是一种静态类型的编程语言,可在 Java 虚拟机上运行,也可以编译为 JavaScript 源代码.其主要发展来自位于俄罗斯圣彼得堡的 JetBrains 程序员团队.虽然语法与 Jav ...

  6. SQL中format()函数对应的格式

    http://www.cnbeta.com/articles/tech/632057.htm

  7. day7 面向对象进阶

    面向对象高级语法部分 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例 ...

  8. Linux的bash快捷键

    Ctrl-A 相当于HOME键,用于将光标定位到本行最前面 Ctrl-E 相当于End键,即将光标移动到本行末尾 Ctrl-B 相当于左箭头键,用于将光标向左移动一格 Ctrl-F 相当于右箭头键,用 ...

  9. git推送本地仓库到github

    总结一下,方便后人,也方便自己查阅.直接写步骤 一.本地创建一个文件夹,在里面写项目的文件(* .php/*.js.....). git本地操作: 1 .  cd  /path/to/project  ...

  10. jenkins定时构建

    打开job的配置界面,在构建触发器栏下有Poll SCM(定时检查源码变更并构建)和Build periodically(周期进行项目构建,不关心源码是否变更) 定时构建语法: * * * * *(和 ...