【贪心】 BZOJ 3252:攻略
3252: 攻略
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 261 Solved: 90
[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
很容易知道贪心策略:每次选价值最高的叶子节点
但是貌似很难搞的样子
朴素算法应该是n^2的样子。。
O(n)显然不太好搞。。
所以大约优化完后是O(nlgn)左右的复杂度。。
有两种logn的方法
1.黄学长的堆。。自行百度。。我只能说代码完全看不懂。。
2.DFS序+线段树
DFS处理出一个点管辖的所有点的DFS序。
然后线段树添加,每次删除。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector> #define maxn 200001 using namespace std; vector<int>graph[maxn]; int rev[maxn],in[maxn],father[maxn],dfn[maxn],last[maxn],tot=; long long a[maxn]; bool vis[maxn]; struct tr{
int l,r,ps;
long long num,tag;
}tree[maxn*]; long long read()
{
long long x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x;
} void DFS(int poi)
{
dfn[poi]=++tot;
rev[tot]=poi;
for(int i=graph[poi].size()-;i>=;i--)
{
int u=graph[poi][i];
DFS(u);
}
last[poi]=tot;
} void psh(int poi)
{
if(tree[poi].tag&&tree[poi].l!=tree[poi].r)
{
tree[poi<<].tag+=tree[poi].tag;
tree[(poi<<)|].tag+=tree[poi].tag;
tree[poi<<].num+=tree[poi].tag;
tree[(poi<<)|].num+=tree[poi].tag;
tree[poi].tag=;
}
} void update(int num,int l,int r,long long d)
{
psh(num);
if(tree[num].l==l&&tree[num].r==r)
{
tree[num].num+=d;
tree[num].tag+=d;
return;
}
int mid=(tree[num].l+tree[num].r)>>;
if(mid>=r)update(num<<,l,r,d);
else if(l>mid)update((num<<)|,l,r,d);
else update(num<<,l,mid,d),update((num<<)|,mid+,r,d);
if(tree[num].l==tree[num].r)return;
if(tree[num<<].num>tree[(num<<)|].num){tree[num].num=tree[num<<].num,tree[num].ps=tree[num<<].ps;}
if(tree[(num<<)|].num>=tree[num<<].num){tree[num].num=tree[(num<<)|].num,tree[num].ps=tree[(num<<)|].ps;}
} void build(int num,int l,int r)
{
if(l==r)
{
tree[num].l=tree[num].r=l;
tree[num].ps=l;
return;
}
int mid=(l+r)>>;
build(num<<,l,mid);
build((num<<)|,mid+,r);
tree[num].l=l,tree[num].r=r;
tree[num].ps=tree[(num<<)|].ps;
} int main()
{
long long ans=;
int n,k;
n=read(),k=read();
for(int i=;i<=n;i++)a[i]=read();
for(int i=;i<n;i++)
{
int u,v;
u=read();v=read();
graph[u].push_back(v);
father[v]=u;
} father[]=; DFS();
build(,,n); for(int i=;i<=n;i++)
update(,dfn[i],last[i],a[i]); while(k--)
{
psh();
ans+=tree[].num;
int u=rev[tree[].ps];
while(u&&!vis[u])
{
vis[u]=;
update(,dfn[u],last[u],-a[u]);
u=father[u];
}
}
printf("%lld",ans);
return ;
}
(死于太久没打tag。。)
【贪心】 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: 攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>, ...
- bzoj 3252 攻略 长链剖分思想+贪心
攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 889 Solved: 423[Submit][Status][Discuss] Descrip ...
- 【刷题】BZOJ 3252 攻略
Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(s ...
- 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 ...
随机推荐
- 【Android学习】调用系统相机
Android调用系统相机分三步走: 首先是要设置调用相机的权限. 其次是给按钮加打开相机的事件. 最后是拍照后进行图片的保存. 第一步,添加权限: <!-- 调用系统相机 --> < ...
- DOS批处理命令-call命令
call命令 在批处理中调用别的批处理或者可运行程序或者 バッチ プログラムを別のバッチ プログラムから呼び出します. 语法 1.CALL [驱动盘符:][路径]文件名 [参数] 调用并执行[驱动盘符 ...
- PC电脑运行Android模拟器总是弹出“视频源”窗体的原因和解决方案
原因: PC电脑运行Android模拟器时弹出“视频源”窗体,会让你"选择视频设备",如:HP TruevIsion HD,而这个视频设备就是你电脑中的内置摄像头,这个内置摄像头在 ...
- 如何检查mysql中建立的索引是否生效的检测方法及相关参数说明
所使用的mysql函数explain语法:explain < table_name >例如: explain select * from t3 where id=3952602;expla ...
- Swift扩展(Extension)
在现有类和结构体的类型基础上,扩展新的功能. 语法: extension SomeType{ // new functionality to add to SomeType goes here } A ...
- Cocos2d-x实例:单点触摸事件
addChild(boxC,30, kBoxC_Tag); ...
- swift闭包传值
不知道原理,就知道这么用的,皮毛上的那一点. 寻思着把以前的项目改成swift的,结果了,,, 反向传值 一. //类似于OC中的typedef typealias sendValueClosure= ...
- swift项目-模仿团购(主界面的搭建,以及首页的一些细节)
以前学习oc的时候写的一个团购的项目,现在学习swift,拿来用swift写一遍,也是连猜带蒙的,一点一点的往上凑. 今天主要是把主要的架子搭起来了. 主要有:UITabBarController,U ...
- UEditor上传图片等附件都出现红叉
我的环境: vs2010+netframework3.5+ueditor1_3_5-utf8-net 问题:UEditor上传图片等附件都出现红叉 尝试了网络上各种方法都不对, 后来只能自己看下ima ...
- android 数据库的创建
主java package com.itheima.createdatabase; import android.app.Activity; import android.content.Contex ...