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所搜引擎slor学习笔记(一)
java搜索引擎有很多,比较熟悉的就是slor和lucene. luncene: 概念:全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置.当用户查 ...
- FPGA设计方法检查表
-----------------------摘自<FPGA软件测试与评价技术> 中国电子信息产业发展研究院 | 编著------------------------------- 文本格 ...
- 比特币pow算法介绍
Proof Of Work 工作量证明 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专家亚当.贝克(Adam Back) 用工作量证明系统解决了互联网垃圾邮件问题,它要求计算机在获得发 ...
- Vue模板语法总结
文本 数据绑定最常见的方式就是使用"Mustache"语法(两个大括号{{ }})的文本插值 <span>Message: {{ msg }}</span> ...
- jumpserver安装教程
centos7系统一步一步安装jumpserver 参照官方文档,查找了百度所有的文档,基本上都是按照官方的文档操作的 官方文档点我-> 安装jumpserver需注意: 1:网络环境要好,有的 ...
- spring学习之三 数据库操作jdbcTemplate
概念 jdbcTemplate就Spring对数据库持久化技术的实现,通过它可以对数据库进行CRUD等操作. JDBCTemplate和代码实现 public void jdbcadd() { Dri ...
- 数据库-mysql中文显示问题
一:在mysql 下面查看带中文的记录显示乱码 mysql> select * from role; +----+------+ | id | name | +----+------+ | 1 ...
- 【Android开发日记】之入门篇(八)——Android数据存储(下)
废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...
- 【[国家集训队]小Z的袜子】
对于L,R的询问.设其中颜色为x,y,z的袜子的个数为a,b,c...那么答案即为(a*(a-1)/2+b*(b-1)/2+c*(c-1)/2....)/((R-L+1)*(R-L)/2)化简得:(a ...
- Linux的bash快捷键
Ctrl-A 相当于HOME键,用于将光标定位到本行最前面 Ctrl-E 相当于End键,即将光标移动到本行末尾 Ctrl-B 相当于左箭头键,用于将光标向左移动一格 Ctrl-F 相当于右箭头键,用 ...