bzoj 3252: 攻略
3252: 攻略
Description
Input
Output
Sample Input
4 3 2 1 1
1 2
1 5
2 3
2 4
Sample Output
HINT
对于100%的数据,n<=200000,1<=场景价值<=2^31-1
Source
题解:
如标签所说,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: 攻略的更多相关文章
- BZOJ[3252]攻略(长链剖分)
BZOJ[3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX半岛> ...
- bzoj 3252: 攻略 -- 长链剖分+贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神 ...
- 【贪心】 BZOJ 3252:攻略
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 261 Solved: 90[Submit][Status][Discuss] De ...
- 【刷题】BZOJ 3252 攻略
Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(s ...
- bzoj 3252 攻略 长链剖分思想+贪心
攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 889 Solved: 423[Submit][Status][Discuss] Descrip ...
- BZOJ.3252.攻略(贪心 长链剖分/线段树)
题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...
- BZOJ 3252: 攻略(思路题)
传送门 解题思路 比较好想的一道思路题,结果有个地方没开\(long\) \(long\) \(wa\)了三次..其实就是模仿一下树链剖分,重新定义重儿子,一个点的重儿子为所有儿子中到叶节点权值最大的 ...
- [HYSBZ - 3252] 攻略
问题描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
随机推荐
- Java高性能并发编程——线程池
在通常情况下,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的 ...
- PostgreSQL内核分析——BTree索引
文中附图参考至<PostgreSQL数据库内核分析> (一)概念描述 B+树是一种索引数据结构,其一个特征在于非叶子节点用于描述索引,而叶子节点指向具体的数据存储位置.在PostgreSQ ...
- day05作业
一.1.switch 2.字符串 3.表达式1 4.break 5.continue 二.1.B 2.A 3.BD 4.D 5.B 6.B 7.A 8.D 9.D 10.B 三.1.√ 2.√ 3.× ...
- linux定时任务-cron
/sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 ...
- java基础47 装饰着模式设计
1.装饰者模式 增强一个类的功能,而且还可以让这些装饰类相互装饰 2.装饰者设计模式的步骤 1.在装饰类的内部维护一个被装饰类的引用 2.让装饰者有一个共同的父类或者父接口 3.实例 packa ...
- 练习题 --- 10种Xpath定位
写出10种不同的Xpath定位语法
- JAVA随笔(二)
在函数传参时,double传给int是不行的,反过来可以.参数只能传值.当参数是字符串时,传递的只是串值:但对于数组来说,传递的是管理权,也就是指针 对象变量是对象管理者. cast转型:基本类型与对 ...
- Eclipse 配置语言环境
一.打开https://www.eclipse.org/babel/downloads.php 选择一下版本的Bable(通天塔) 选择 解压 打开Eclipse 软件 选择Help->inst ...
- Unix IPC之Posix消息队列(2)
/* Query status and attributes of message queue MQDES. */ extern int mq_getattr (mqd_t __mqdes, stru ...
- information_schema Introduction
information_schema介绍 information_schema数据库是MySQL自带的,里面的“表”保存着服务器当前的实时信息.它提供了访问数据库元数据的方式.元数据是关于数据的数据, ...