BZOJ3252: 攻略
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
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
return x*f;
}
typedef long long ll;
const int maxn=200010;
int n,k,A[maxn],first[maxn],next[maxn],to[maxn],e;
void AddEdge(int v,int u) {to[++e]=v;next[e]=first[u];first[u]=e;}
int st[maxn],en[maxn],pos[maxn],fa[maxn],del[maxn],cnt;
ll val[maxn];
void dfs(int x) {
st[x]=++cnt;pos[cnt]=x;val[x]+=A[x];
ren val[to[i]]=val[x],fa[to[i]]=x,dfs(to[i]);
en[x]=cnt;
}
struct Ans {int p;ll v;}maxv[maxn<<2];
Ans better(Ans A,Ans B) {
if(A.v>B.v) return A;
return B;
}
ll addv[maxn<<2];
void maintain(int o,int l,int r) {
int lc=o<<1,rc=lc|1;
if(l<r) maxv[o]=better(maxv[lc],maxv[rc]);
else maxv[o]=(Ans){l,0};
if(addv[o]) maxv[o].v+=addv[o];
}
void build(int o,int l,int r) {
if(l==r) addv[o]=val[pos[l]];
else {
int mid=l+r>>1,lc=o<<1,rc=lc|1;
build(lc,l,mid);build(rc,mid+1,r);
}
maintain(o,l,r);
}
void update(int o,int l,int r,int ql,int qr,int v) {
if(ql<=l&&r<=qr) addv[o]+=v;
else {
int mid=l+r>>1,lc=o<<1,rc=lc|1;
if(addv[o]) addv[lc]+=addv[o],addv[rc]+=addv[o],addv[o]=0;
if(ql<=mid) update(lc,l,mid,ql,qr,v);
else maintain(lc,l,mid);
if(qr>mid) update(rc,mid+1,r,ql,qr,v);
else maintain(rc,mid+1,r);
}
maintain(o,l,r);
}
int main() {
n=read();k=read();
rep(i,1,n) A[i]=read();
rep(i,1,n-1) AddEdge(read(),read());
dfs(1);build(1,1,n);ll ans=0;
while(k--) {
Ans x=maxv[1];ans+=x.v;
if(!x.v) break;
int u=pos[x.p];
while(u&&!del[u]) {
del[u]=1;
update(1,1,n,st[u],en[u],-A[u]);
u=fa[u];
}
}
printf("%lld\n",ans);
return 0;
}
BZOJ3252: 攻略的更多相关文章
- [bzoj3252]攻略_dfs序_线段树_贪心
攻略 bzoj-3252 题目大意:给定一棵n个节点的有根树,点有点权.让你选出至多k个节点,使得他们到根的链的并最大. 注释:$1\le n\le 2\cdot 10^5$,$1\le val_i\ ...
- 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 ...
随机推荐
- codevs2645 Spore
题目描述 Description 某陈和某Y 最近对一个游戏着迷.那是Electronic Arts 今年发布的优秀的模拟经营类游戏,Spore. 在Spore 中,玩家将经历从单细胞生物到星系的统治 ...
- 布局之按钮的图片分辨率--Android Studio
在布局页面,想把取消按钮和确认钮大小一致,刚开始想法是错的,不用在控制层设置,也不用在布局层压缩图片,有两个方法法: 1.直接用美图秀秀“尺寸”功能,修改成另一按钮一样的分辨率. 2.设置按钮相同高度 ...
- PYTHON 函数的普通参数
# 形式参数,还没有赋值的代指参数 def kd(p): print(p) return True #实际参数,只有实际值的参数 ret = kd(") if ret: print(&quo ...
- (转)Intent flag 与启动模式的对应关系
原文地址:http://www.cnblogs.com/ttylinux/p/4069513.html Activity有四种启动模式: 1.standard(标准) 2.singleTop ...
- 孙鑫C++教程留下来的作业--如何让工具栏在原来隐藏的位置出现
--加油,不仅仅是口号! BEGIN---------------------------------- 将工具栏进行停靠.当隐藏后再次点击出现的时候它出现在工具栏顶部了,并没有停靠在原来的位置,如何 ...
- python运算符
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAHCCAIAAADzel4SAAAgAElEQVR4Aey9+bMcSXLnV1dmna/ejR
- mediastreamer使用教程
mediastreamer使用教程 1.各个函数功能简介 ms_filter_destroy 释放filter资源 ms_ticker_destroy释放ticker 说明:ticker为定时器线程, ...
- java17
1:登录注册案例(理解) 2:Set集合(理解) (1)Set集合的特点 无序,唯一 (2)HashSet集合(掌握) A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法: ...
- Host文件设置
地址:C:\Windows\System32\drivers\etc 可以在注释语句前加入 "#" hosts文件是Windows系统中一个负责IP地址与域名快递解析的文件,以AS ...
- gcc 使用
参数 -E 只进行预处理-S 预处理和编译,生成汇编文件-c 预处理,编译和汇编,生成目标文件-g ...