【BZOJ3252】攻略

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

题解:由于原题就是一个费用流,所以本题我们依旧试图模拟一下费用流的过程。

先spfa找到一条最长路,然后将这些边的正向边流量变为0,再加入反向边。。。等等,加反向边好像没啥用?

因为我们永远也不会走反向边,那么我们只需要每次贪心的选取一条最长的路径即可。具体地,我们用线段树维护DFS序,位置i的值为从根节点到i的路径长度。每次找到最长路后,将路径上所有未被访问过的点都拿出来,更新一下它子树中所有点的路径长度即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=200010;
typedef long long ll;
int n,k,cnt;
ll ans;
int p[maxn],q[maxn],to[maxn<<1],next[maxn<<1],head[maxn<<1],fa[maxn],vis[maxn],org[maxn];
int ps[maxn<<2];
ll s[maxn<<2],tag[maxn<<2],dep[maxn],v[maxn];
int rd()
{int ret=0;    char gc=getchar();while(gc<'0'||gc>'9')  gc=getchar();while(gc>='0'&&gc<='9')   ret=ret*10+gc-'0',gc=getchar();return ret;
}
void add(int a,int b)
{to[++cnt]=b,next[cnt]=head[a],head[a]=cnt;
}
void dfs(int x)
{p[x]=++p[0],org[p[0]]=x;for(int i=head[x];i;i=next[i])   if(to[i]!=fa[x])   dep[to[i]]=dep[x]+v[to[i]],fa[to[i]]=x,dfs(to[i]);q[x]=p[0];
}
void pushup(int x)
{s[x]=max(s[lson],s[rson]);ps[x]=(s[lson]>=s[rson])?ps[lson]:ps[rson];
}
void pushdown(int x)
{if(tag[x]) s[lson]+=tag[x],s[rson]+=tag[x],tag[lson]+=tag[x],tag[rson]+=tag[x],tag[x]=0;
}
void build(int l,int r,int x)
{if(l==r){s[x]=dep[org[l]],ps[x]=org[l];return ;}int mid=l+r>>1;build(l,mid,lson),build(mid+1,r,rson);pushup(x);
}
void updata(int l,int r,int x,int a,int b,int c)
{if(a<=l&&r<=b){s[x]-=c,tag[x]-=c;return ;}pushdown(x);int mid=l+r>>1;if(a<=mid)  updata(l,mid,lson,a,b,c);if(b>mid)   updata(mid+1,r,rson,a,b,c);pushup(x);
}
int main()
{n=rd(),k=rd();int i,a,b,t;for(i=1;i<=n;i++)   v[i]=rd();for(i=1;i<n;i++)   a=rd(),b=rd(),add(a,b),add(b,a);dep[1]=v[1],dfs(1);build(1,n,1);for(i=1;i<=k;i++){t=ps[1],ans+=s[1];while(t&&!vis[t])  vis[t]=1,updata(1,n,1,p[t],q[t],v[t]),t=fa[t];}printf("%lld",ans);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7278001.html

【BZOJ3252】攻略 DFS序+线段树(模拟费用流)相关推荐

  1. bzoj3252 攻略 dfs序+线段树

    题目传送门 题目大意:给出一棵树,1为根节点,每个节点都有权值,每个叶子节点都是一个游戏的结局,选择k个游戏结局,使得权值总和最大,同一个节点不会被重复计算. 思路:这道题最关键的是要想到一个性质,就 ...

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

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

  3. 【贪心 / 线段树模拟费用流增广】BZOJ4977 [Lydsy八月月赛] 跳伞求生

    [题目] 原题地址 有nn个队友和mm个敌人,每个队友有一个攻击力aia_i,每个敌人有攻击力bib_i和价值cic_i.你可以选择若干个队友,每个队友ii分别去怼一个敌人jj,当ai>bja_ ...

  4. bzoj3252攻略 贪心+dfs序+线段树

    题目链接:戳这里 3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 605  Solved: 255 [Submit][Status] ...

  5. dfs序+线段树 BZOJ3252 攻略

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 496  Solved: 211 [Submit][Status][Discuss] ...

  6. New Year Tree(dfs序+线段树+二进制)

    题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...

  7. 求和(dfs序+线段树)

    题意: 已知有n个节点,有n−1条边,形成一个树的结构. 给定一个根节点k,每个节点都有一个权值,节点i的权值为vi​. 给m个操作,操作有两种类型: 1 a x :表示将节点a的权值加上x 2 a ...

  8. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  9. codeforces E. Jamie and Tree LCA+dfs序+线段树

    题解: 写起来还稍微有点麻烦. dfs序+线段树可以维护子树的整体修改和查询. 因此,这道题我们要往子树上靠. 我们首先从1号点进行dfs遍历,顺便求出点的dfs序和深度,然后我们采用倍增的思想,可以 ...

最新文章

  1. 月入5W,月花销不足2K的程序员,可免费获得AI女友一名
  2. AI键盘侠来了:DeepMind开始训练智能体像人一样「玩」电脑
  3. fastjson判空_fastjson JSON 对象为空保留null
  4. Java面向对象(17)--类代码块
  5. html打包成app的缓存问题,webpack 独立打包与缓存处理
  6. Linux 日志系统
  7. java清理垃圾_垃圾清理势在必行——Java垃圾收集算法
  8. 项目管理---SVN,Subversion的安装,客户端和服务端
  9. 《Cisco防火墙》一8.7 通过NAT规则定义连接限制
  10. spring页面使用注解@RequestParam把请求参数封装到map中
  11. [转]安装完成后机器重新启动运行 JBuilder 时却每次只是看到 L
  12. linux rs232驱动程序,Ubuntu安装USB to RS232驱动
  13. 天线巴伦制作和原理_一种宽带集成巴伦及天线单元的制作方法
  14. hau 1870 愚人节的礼物(栈)
  15. AGV-倍福beckhoff TWINCAT2及台达电机、传感器等使用总结
  16. HTML5课程心得学生,HTML5培训心得体会
  17. 如何将倒序改为正序C语言,快速排序(正序+倒序)C语言版
  18. 我30岁自学编程,当上高级工程师,几度精疲力尽想放弃
  19. flex水平垂直居中
  20. Java - 三种基本的设计模式

热门文章

  1. 线元法输入曲线要素_机械图纸·每日一符:线轮廓度
  2. 测试行业的发展趋势和看法
  3. 关于NetKeeper(创翼)升级后,无法共享WIFI问题的解决-猎豹、360都可
  4. 索尼信息系统软件测试,〖分享〗索尼工程模式*#*#7378423*#*#,各项测试!
  5. QT如何录制麦克风与实现内录
  6. 中小企业ERP系统选型四个标准分析
  7. nextjs如何启动https服务
  8. 你不知道的 Linux 使用技巧分享
  9. docker实现原理总结
  10. makehuman导出MD5