【BZOJ3252】攻略
题解:
首先贪心的会发现我们每次一定会选当前权值和最大的那个
然后在于怎么维护这个最大值
我们发现每个修改实际上是对沿途所有点的子树的修改
所以用线段树维护就可以了。。
另外注意有重复部分,但一定是包含关系所以比较好处理
代码:
#include <bits/stdc++.h>
using namespace std;
#define IL inline
#define ll long long
#define rint register ll
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define mid ((h+t)/2)
char ss[<<],*A=ss,*B=ss;
char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T> void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=c^;
while (c=gc(),<c&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
const ll INF=1e9;
const ll N=3e5;
ll n,m,k,l,v[N],head[N],maxn[N],minn[N],sum[N],fa[N],cnt,ans;
struct re{
ll a,b;
}a[N];
const ll N2=N*;
ll data1[N2],data2[N2],data3[N2],lazy1[N2],lazy2[N2],real2[N2];
void arr(ll x,ll y)
{
a[++l].a=head[x];
a[l].b=y;
head[x]=l;
}
IL void down(ll x)
{
if (!lazy1[x]) return;
lazy1[x*]=lazy1[x*+]=lazy1[x];
lazy2[x*]+=lazy2[x];
lazy2[x*+]+=lazy2[x];
data3[x*]+=lazy2[x]; data3[x*+]+=lazy2[x];
data2[x*]=lazy1[x]; data2[x*+]=lazy1[x];
lazy1[x]=lazy2[x]=;
}
IL void updata(ll x)
{
if (data3[x*]<data3[x*+])
{
data2[x]=data2[x*+];
data1[x]=data1[x*+];
data3[x]=data3[x*+];
} else
{
data2[x]=data2[x*];
data1[x]=data1[x*];
data3[x]=data3[x*];
}
}
void build(ll x,ll h,ll t)
{
if (h==t)
{
data1[x]=real2[h]; return;
}
build(x*,h,mid); build(x*+,mid+,t);
}
void change(ll x,ll h,ll t,ll h1,ll t1,ll k1,ll k2)
{
if (h1<=h&&t<=t1)
{
lazy1[x]=k1; lazy2[x]+=k2; data3[x]+=k2; data2[x]=k1;
return;
}
down(x);
if (h1<=mid) change(x*,h,mid,h1,t1,k1,k2);
if (mid<t1) change(x*+,mid+,t,h1,t1,k1,k2);
updata(x);
}
void dfs1(ll x)
{
ll u=head[x];
if (!u)
{
real2[++cnt]=x;
return;
}
while (u)
{
ll vv=a[u].b;
dfs1(vv);
u=a[u].a;
}
}
void dfs(ll x,ll y)
{
ll u=head[x]; sum[x]=y+v[x];
if (!u)
{
minn[x]=maxn[x]=++cnt;
real2[cnt]=x;
change(,,n,cnt,cnt,,sum[x]);
return;
}
while (u)
{
ll vv=a[u].b;
dfs(vv,y+v[x]);
minn[x]=min(minn[x],minn[vv]);
maxn[x]=max(maxn[x],maxn[vv]);
u=a[u].a;
}
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
read(n); read(k);
rep(i,,n) read(v[i]);
rep(i,,n) minn[i]=INF;
rep(i,,n-)
{
ll x,y;
read(x); read(y); arr(x,y); fa[y]=x;
}
dfs1();
build(,,n); cnt=;
dfs(,);
rep(i,,k)
{
ll x=data1[],y=data2[],z=data3[];
ans+=z;
int kk1=minn[x]-,kk2=minn[x];
while (x!=y)
{
if (kk1>=minn[x]) change(,,n,minn[x],kk1,x,-(sum[x]-sum[y]));
if (kk2<=maxn[x]) change(,,n,kk2,maxn[x],x,-(sum[x]-sum[y]));
kk1=minn[x]-; kk2=maxn[x]+;
x=fa[x];
}
}
cout<<ans<<endl;
return ;
}
【BZOJ3252】攻略的更多相关文章
- [bzoj3252]攻略_dfs序_线段树_贪心
攻略 bzoj-3252 题目大意:给定一棵n个节点的有根树,点有点权.让你选出至多k个节点,使得他们到根的链的并最大. 注释:$1\le n\le 2\cdot 10^5$,$1\le val_i\ ...
- BZOJ3252: 攻略
Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景 ...
- BZOJ3252攻略——长链剖分+贪心
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...
- BZOJ3252 攻略 [树链剖分]
题目传送门 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1169 Solved: 554[Submit][Status][Discuss] ...
- bzoj3252 攻略 dfs序+线段树
题目传送门 题目大意:给出一棵树,1为根节点,每个节点都有权值,每个叶子节点都是一个游戏的结局,选择k个游戏结局,使得权值总和最大,同一个节点不会被重复计算. 思路:这道题最关键的是要想到一个性质,就 ...
- bzoj3252攻略(线段树+dfs序)
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 562 Solved: 238[Submit][Status][Discuss] D ...
- BZOJ3252 攻略(贪心+dfs序+线段树)
考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...
- BZOJ3252: 攻略 可并堆
网上有很多人说用dfs序+线段树做...其实stl的堆可以...可并堆可以...很多奇奇怪怪的东西都能做... 可并堆比较好想...也比较好写... 分析: 首先,这是一个网络流做不了的题...数据太 ...
- BZOJ3252 攻略 贪心、长链剖分
传送门 给树竟直接给父子关系!!!真良心 首先一个贪心策略:每一次选择的链一定是所有链中权值最大的.这应该比较显然 那么我们接下来考虑如何维护这个贪心.我们可以使用长链剖分进行维护,对权值进行长链剖分 ...
- bzoj3252: 攻略(贪心)
/* 因为权值都是正的, 所以贪心的正确性能保证 然后重链贪心跑一下就好了 */ #include<cstdio> #include<algorithm> #include&l ...
随机推荐
- 响应式页面-@media介绍
01 响应式页面-@media介绍, 我们为什么要写自适应的页面(响应式页面) 众所周知,电脑.平板.手机的屏幕是差距很大的,假如在电脑上写好了一个页面,在电脑上看起来不错,但是如果放到手机上的话 ...
- Protobuf3 语法指南
目录 [−] 定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类型 添加注释 保留标识符(Reserved) 从.proto文件生成了什么? 标量数值类型 默认值 枚举 使用其他 ...
- linux与window互传文件
首先我们的目标是把一个很大的文件传到linux中,所以我们先要让linux节点开启ftp服务 FTP 10.1.61.212 如果对方没有开启FTP服务,那么这个命令就不会有效果. 1.开启xftp ...
- textarea的高度随内容变化而变化
<li class="text"> <span>参赛宣言*</span> <textarea name="txt" i ...
- 安卓易学,爬坑不易—腾讯老司机的RecyclerView局部刷新爬坑之路
前言 安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人.下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程. 话说有图有真 ...
- OCP 相关课程列表
OCP 相关课程列表 第一天:Linux基础 和 Oracle 11 R2 数据库安装教程图解 1:< VM 安装 linux Enterprise_R5_U4_Server_I386_DVD教 ...
- 关于vue的基础概念
vue-cli相当于脚手架 给你自动生成模板工程vue-router是 vue路由插件 支持你单页应用的vue-loader是webpack下loader插件 可以把.vue文件 输出成组件
- 1010:Tempter of the Bone
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 Problem Description The doggie found a bone in a ...
- Django框架之Form组件
一.初探Form组件 在介绍Form组件之前,让大家先看看它强大的功能吧!Go... 下面我们来看看代码吧! 1.创建Form类 from django.forms import Form from ...
- java 自动包装功能
基本类型直接存储在堆栈中 基本类型所具有的包装容器,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型 基本类型与包装容器类对应如下:boolean Booleanbyte Byte short ...