hdu5242 Game (贪心+dfs序)
dfs序后用线段树来记每个节点的前缀和
每次找一个前缀和最大的节点,然后把它到根的路径上的每个之前没被走过的点 对应的dfs序的区间 减掉那个点的权值
每个点最多被减一次,复杂度是$O(nlogn)$的
#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int eg[maxn][],egh[maxn],ect,root,fa[maxn];
int N,K,ch[maxn][],pct,dfn[maxn][],tot,id[maxn];
ll v[maxn],dis[maxn],ma[maxn],mi[maxn];
ll laz[maxn];
bool flag[maxn]; inline void adeg(int a,int b){
eg[++ect][]=b;eg[ect][]=egh[a];egh[a]=ect;
} void dfs(int x){
dfn[x][]=++tot,id[tot]=x; for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa[x]) continue;
fa[b]=x;dis[b]=dis[x]+v[b];
dfs(b);
}
dfn[x][]=tot;
} inline void update(int p){
if(!ch[p][]) return;
if(ma[ch[p][]]>ma[ch[p][]]) ma[p]=ma[ch[p][]],mi[p]=mi[ch[p][]];
else ma[p]=ma[ch[p][]],mi[p]=mi[ch[p][]];
}
inline void pushdown(int p){
if(!laz[p]||!ch[p][]) return;
ma[ch[p][]]+=laz[p],ma[ch[p][]]+=laz[p];
laz[ch[p][]]+=laz[p],laz[ch[p][]]+=laz[p];
laz[p]=;
} void build(int &p,int l,int r){
p=++pct;
if(l==r) ma[p]=dis[id[l]],mi[p]=id[l];
else{
int m=l+r>>;
build(ch[p][],l,m);build(ch[p][],m+,r);
update(p);
}
} void add(int p,int l,int r,int x,int y,ll z){
pushdown(p);
if(x<=l&&r<=y){
laz[p]+=z;ma[p]+=z;
pushdown(p);
}else{
int m=l+r>>;
if(x<=m) add(ch[p][],l,m,x,y,z);
if(y>=m+) add(ch[p][],m+,r,x,y,z);
update(p);
}
} int main(){
//freopen("","r",stdin);
int i,j,k;
int T=rd();
for(int tt=;tt<=T;tt++){
N=rd(),K=rd();
CLR(ch,);CLR(egh,);CLR(laz,);ect=pct=tot=root=;
CLR(dis,);CLR(flag,);
for(i=;i<=N;i++) v[i]=rd();
for(i=;i<N;i++){
int a=rd(),b=rd();
adeg(a,b);
}
dis[]=v[];dfs();
build(root,,N);
ll ans=;
for(i=;i<=K;i++){
ans+=ma[root];int ii=mi[root];
// printf("!%lld %d\n",ma[root],mi[root]);
while(ii&&!flag[ii]){
add(root,,N,dfn[ii][],dfn[ii][],-v[ii]);
// printf("--%d %d %d\n",dfn[ii][0],dfn[ii][1],v[ii]);
flag[ii]=;ii=fa[ii];
}
}
printf("Case #%d: %lld\n",tt,ans);
}
return ;
}
hdu5242 Game (贪心+dfs序)的更多相关文章
- 【bzoj3252】攻略  贪心+DFS序+线段树
		
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某 ...
 - BZOJ3252 攻略(贪心+dfs序+线段树)
		
考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...
 - BZOJ 3252题解(贪心+dfs序+线段树)
		
题面 传送门 分析 此题做法很多,树形DP,DFS序+线段树,树链剖分都可以做 这里给出DFS序+线段树的代码 我们用线段树维护到根节点路径上节点权值之和的最大值,以及取到最大值的节点编号x 每次从根 ...
 - bzoj3252 攻略   贪心+dfs序+线段树
		
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3252 题解 有一个非常显然的贪心思路:每次选择目前走到那儿能够获得的新权值最大的点. 证明的话 ...
 - uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心
		
#139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...
 - HDU - 6203:ping ping ping (DFS序 贪心)
		
pro:给定N+1个点的树,有M对关键点,现在让你破坏最少的点,使得M对关键点不连通. sol:贪心,我们把M对点按照LCA深度排序,每次破坏LCA. 如果一对点(u,v,lca),u-lca-v有点 ...
 - 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
		
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...
 - 【BZOJ-3252】攻略        DFS序 + 线段树 + 贪心
		
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
 - Codeforces Round #442 (Div. 2)A,B,C,D,E(STL,dp,贪心,bfs,dfs序+线段树)
		
A. Alex and broken contest time limit per test 2 seconds memory limit per test 256 megabytes input s ...
 
随机推荐
- 20155304 《网络对抗》Exp9 web安全基础实践
			
20155304 <网络对抗>Exp9 web安全基础实践 实验后回答问题 (1)SQL注入攻击原理,如何防御 攻击原理:web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应 ...
 - STM32之HAL库、标准外设库、LL库
			
标准外设库(Standard Peripherals Library),应该是最早推出的版本,以前用STM32F103的时候,用的多 HAL(Hardware Abstraction Layer),硬 ...
 - Android环境下使用call_usermodehelper()以及调试
			
有时候设备驱动需要做一些与其他的设备通信的操作,但是驱动本身又不可以去实作,那这个时候就可以通过调用用户态的软件,通过这个软件和其他的设备进行通信. 那在内核态如何去调用用户态的程序呢?call_us ...
 - 微服务监控zipkin、skywalking以及日志ELK监控系列
			
0.整体架构 整体架构目录:ASP.NET Core分布式项目实战-目录 一.目录 1.zipkin监控 2.skywalking监控 3.ELK日志监控 asp.net Core 交流群:78746 ...
 - phpmyadmin连接MySQL服务器被拒绝
			
显示: phpMyAdmin 尝试连接到MySQL服务器,但服务器拒绝连接.您应该检查配置文件中的主机.用户名和密码,并确认这些信息与 MySQL 服务器管理员所给出的信息一致. 原因: 可能是修改了 ...
 - 总结com组件问题,随笔记录
			
一.从 IClassFactory 为 CLSID 为 {00024500-0000-0000-C000-000000000046} 的 COM 组件创建实例失败,原因是出现以下错误:80010001 ...
 - [咸恩静][Real Love]
			
歌词来源:http://music.163.com/#/song?id=484056972 作曲 : Andrew 崔/Brian Cho/220 [作曲 : Andrew 崔/Brian Cho/2 ...
 - foreach 当被循环的变量为空时 不进入循环
			
$a = []; foreach($a as $v){ echo 222; } //不会输出222 并且不会报错
 - Beta任务项录入
			
今天PM把任务项整理写入TFS中,明天开始正式开发工作:
 - Linux内核实验作业四
			
实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: ...