bzoj3252攻略(线段树+dfs序)
3252: 攻略
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 562 Solved: 238
[Submit][Status][Discuss]
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序所对应的点的编号。
每次查询区间最大值,然后删去这条链,每次删的时候更新子树权值(区间减法)。
删除把这个点的权值赋值为0就好。然后往上走,走的时候到某个点权值为0那么就停。
因为如果某个点权值为0,那么他到根的路径上所有点权都为零。恩。
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 200007
#define ll long long using namespace std;
ll n,m,ans,cnt,tot;
ll head[N],dis[N],fa[N];
ll S[N],pos[N],T[N],a[N];
struct edge{
int u,v,net,w;
}e[N<<];
struct tree{
ll l,r,mx,pos,flag;
}tr[N<<]; namespace seg
{
void pushup(int k)
{
if(tr[k<<].mx>tr[k<<|].mx) tr[k].mx=tr[k<<].mx,tr[k].pos=tr[k<<].pos;
else tr[k].mx=tr[k<<|].mx,tr[k].pos=tr[k<<|].pos;
}
void pushdown(int k)
{
tr[k<<].flag+=tr[k].flag;tr[k<<|].flag+=tr[k].flag;
tr[k<<].mx+=tr[k].flag;tr[k<<|].mx+=tr[k].flag;
tr[k].flag=;
}
void build(int k,int l,int r)
{
tr[k].l=l;tr[k].r=r;
if(l==r)
{
tr[k].mx=dis[pos[l]],tr[k].pos=pos[l];
return;
}
int mid=l+r>>;
build(k<<,l,mid);build(k<<|,mid+,r);
pushup(k);
}
void update(int k,int l,int r,int z)
{
if(tr[k].l==l && tr[k].r==r)
{
tr[k].mx+=z;tr[k].flag+=z;
return;
}
pushdown(k);
int mid=tr[k].l+tr[k].r>>;
if(r<=mid) update(k<<,l,r,z);
else if(l>mid) update(k<<|,l,r,z);
else update(k<<,l,mid,z),update(k<<|,mid+,r,z);
pushup(k);
} }using namespace seg; inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].net=head[u];head[u]=cnt;
} inline ll read()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void dfs(int u,int last,ll sum)
{
S[u]=++tot;pos[tot]=u;dis[u]=sum;
for(int i=head[u];i;i=e[i].net)
{
int v=e[i].v;
if(v==last) continue;
fa[v]=u;dfs(v,u,sum+a[v]);
}T[u]=tot;
} void change(int u)
{
while(a[u])
{
update(,S[u],T[u],-a[u]);
a[u]=;u=fa[u];
}
} int main()
{
int x,y;
n=read();m=read();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<n;i++)
{
x=read();y=read();
add(x,y);add(y,x);
}ans=a[];a[]=;dfs(,,);
build(,,n);
while(m--)
{
tree Tr=tr[];ans+=Tr.mx;
change(Tr.pos);
}
printf("%lld\n",ans);
return ;
}
bzoj3252攻略(线段树+dfs序)的更多相关文章
- BZOJ3252 攻略(贪心+dfs序+线段树)
考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序
题目大意 Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3306】树 线段树 + DFS序
3306: 树 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 792 Solved: 262[Submit][Status][Discuss] De ...
随机推荐
- Mvc系统学习9——Areas学习
在Mvc2.0中,新增加了一个特性就是Areas.在没有有使用Areas的情况下,我们的Mvc项目组织是下面这样的.当项目庞大的时候,Controllers,Model,View文件下下面势必会有很多 ...
- english & utils & tools
english & utils & tools https://openlanguage.com/ https://www.grammarly.com/blog/email-writi ...
- org.osgi.framework.BundleException: Exception in org.eclipse.core.resources.ResourcesPlugin.start()
http://freestyle21.cn 不知什么时候,启动eclipse的时候就一直不行,说是an error ..我查了下log 报错:org.osgi.framework.BundleExce ...
- QQ5.0侧滑
package com.example; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; impo ...
- linux 常见名词及命令(四)
yum仓库的配置 yum仓库的配置文件存放在/etc/yum.repos.d/目录中. 第一步:切换到/etc/yum.repos.d/目录中. 第二步:使用vim编辑器打开一个名为'rhel7.re ...
- MyBatis 3在Insert之后返回主键
XML: <insert id="addUser" parameterType="User" useGeneratedKeys="true&qu ...
- 携程Apollo(阿波罗)配置中心使用Google代码风格文件(在Eclipse使用Google代码风格)(配合阿里巴巴代码规约快速设置)
Apollo默认使用了Google的代码风格,文件放在这里: https://github.com/ctripcorp/apollo/tree/master/apollo-buildtools/sty ...
- 携程Apollo(阿波罗)配置中心的Java样例客户端启动和调试
参考:https://github.com/ctripcorp/apollo/wiki/Apollo%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97#23-java%E6%A0 ...
- 图片在 canvas 中的 选中/平移/缩放/旋转,包含了所有canvas的2D变化,让你认识到数学的重要性
1.介绍 canvas 已经出来好久了,相信大家多少都有接触. 如果你是前端页面开发/移动开发,那么你肯定会有做过图片上传处理,图片优化,以及图片合成,这些都是可以用 canvas 实现的. 如果你是 ...
- 怎样用ccache加速cocos2d-x android版本号的编译
下面步骤在MAC下測试通过: 首先是安装CCache, 能够用homebrew brew install --HEAD ccache 也能够用源代码安装 git clone https://githu ...