【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 ...
随机推荐
- Python3学习笔记02-基础语法
默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串 ' # -*- coding:cp-1252 -*-' 也可以指定其他编码,以上用cp-1252字符 ...
- hibernate框架学习之数据抓取(加载)策略
Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...
- ansible笔记(5):常用模块之文件操作(二)
ansible笔记():常用模块之文件操作(二) 文件操作类模块 find模块 find模块可以帮助我们在远程主机中查找符合条件的文件,就像find命令一样. 此处我们介绍一些find模块的常用参数, ...
- Zabbix3.0.4监控Windows的CPU使用百分比并在CPU使用率超过90%触发报警
Zabbix3.0.4监控Windows的CPU使用百分比 Zabbix 自带的模块没有 CPU 使用率(百分比)这个监控项,我们可以通过添加计数器的方式实现 CPU 百分比的监控. 1.在Zabbi ...
- 如何保障Web应用安全性
通过加密算法对关键数据进行加密 通过过滤器防御跨站脚本攻击XSS.跨域请求伪造CRSF和SQL注入 通过安全框架( Shiro.Spring Security )进行认证和授权 设置IP黑白名单来进行 ...
- HTML网页背景图很长要有滚动条滑动
1 前言 由于网页背景图非常长,然后会出现只显示当前页面,后面部分看不到,也不能滑动,开始以为不能滑动应该是没有加overflow-y: auto(scroll),结果加上去也是无效的. 2 代码 & ...
- Sql 08数据库还原数据库时一直提示数据库被占用
直接试试这个sql语句吧 ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE ALTER database [datebase] ...
- vue 之 引入elementUI(两步走)
1.npm 引入elementUI npm i element-ui -S 2.在main.js文件中全局引入 import ElementUI from 'element-ui' import 'e ...
- js——prototype、__proto__、constructor
Object 1. Object是一个函数(typeof O ...
- restful中的分页
普通分页 普通分页类似于Django中的分页 源码 class PageNumberPagination(BasePagination): """ A simple pa ...