3252: 攻略

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 261  Solved: 90
[Submit][Status][Discuss]

Description

题目简述:树版[k取方格数]
 
众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏。
今天他得到了一款新游戏《XX半岛》,这款游戏有n个场景(scene),某些场景可以通过不同的选择支到达其他场景。所有场景和选择支构成树状结构:开始游戏时在根节点(共通线),叶子节点为结局。每个场景有一个价值,现在桂马开启攻略之神模式,同时攻略k次该游戏,问他观赏到的场景的价值和最大是多少(同一场景观看多次是不能重复得到价值的)
“为什么你还没玩就知道每个场景的价值呢?”
“我已经看到结局了。”

Input

第一行两个正整数n,k
第二行n个正整数,表示每个场景的价值
以下n-1行,每行2个整数a,b,表示a场景有个选择支通向b场景(即a是b的父亲)
保证场景1为根节点

Output

 
输出一个整数表示答案

Sample Input

5 2
4 3 2 1 1
1 2
1 5
2 3
2 4

Sample Output

10

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:攻略的更多相关文章

  1. BZOJ[3252]攻略(长链剖分)

    BZOJ[3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX半岛> ...

  2. bzoj 3252: 攻略 -- 长链剖分+贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Description 题目简述:树版[k取方格数]   众所周知,桂木桂马是攻略之神,开启攻略之神 ...

  3. bzoj 3252: 攻略

    3252: 攻略 Description 题目简述:树版[k取方格数]   众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>, ...

  4. bzoj 3252 攻略 长链剖分思想+贪心

    攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 889  Solved: 423[Submit][Status][Discuss] Descrip ...

  5. 【刷题】BZOJ 3252 攻略

    Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(s ...

  6. BZOJ.3252.攻略(贪心 长链剖分/线段树)

    题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...

  7. BZOJ 3252: 攻略(思路题)

    传送门 解题思路 比较好想的一道思路题,结果有个地方没开\(long\) \(long\) \(wa\)了三次..其实就是模仿一下树链剖分,重新定义重儿子,一个点的重儿子为所有儿子中到叶节点权值最大的 ...

  8. [HYSBZ - 3252] 攻略

    问题描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...

  9. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

随机推荐

  1. ORACLE之PACKAGE

    刚学pl/sql编程,写了两个package.pkg_temp_fn和pkg_temp_fn2.内容涉及pl/sql基本语法,游标,存储过程(in,out),函数(有返回值). pkg_temp_fn ...

  2. HDOJ2009求数列的和

    求数列的和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. python学习day3--python基础

    1.python不用声明变量的类型,运行时python自己进行判断 2.尽量不要用“+”去拼接字符串,运行时会每遇到一个“+”就开辟一块内存空间,使用如下方式进行字符串的拼接. msg=''' inf ...

  4. Contoso 大学 - 使用 EF Code First 创建 MVC 应用

    原文 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 Contoso 大学 Web 示例应用演示了如何使用 EF 技术创建 ASP.NET MVC 应用.示例中的 Co ...

  5. Swift协议(Protocol)

    协议是为方法.属性等定义一套规范,没有具体的实现. 协议能够被类.结构体等具体实现(或遵守). protocol SomeProtocol { // protocoldefinition goes h ...

  6. Android的selector,背景选择器

    原文地址 http://android.blog.51cto.com/268543/564581 首先android的selector是在drawable/xxx.xml中配置的,相关图片放在同目录下 ...

  7. WinForms 小型HTML服务器

    最近教学,使用到了Apache和IIS,闲着无聊,有种想自己写个小服务器的冲动. 在网上找了半天的资料,最后终于搞定了,测试可以访问.效果图如下: 因为只是处理简单的请求,然后返回请求的页面,所以没有 ...

  8. 【Qt】数据库连接池

    请查看公孙二狗的文章 数据库连接池

  9. php无极分类

    <?php date_default_timezone_set('PRC'); header('Content-type:text/html;charset=UTF-8'); /* $a_lis ...

  10. 《PHP与MySQL WEB开发》读书笔记

    <PHP与MySQL WEB开发>读书笔记 作者:[美]Luke Welling PHP输出的HereDoc语法: echo <<<theEnd line 1 line ...