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序)的更多相关文章

  1. 【bzoj3252】攻略 贪心+DFS序+线段树

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

  2. BZOJ3252 攻略(贪心+dfs序+线段树)

    考虑贪心,每次选价值最大的链.选完之后对于链上点dfs序暴力修改子树.因为每个点最多被选一次,复杂度非常正确. #include<iostream> #include<cstdio& ...

  3. BZOJ 3252题解(贪心+dfs序+线段树)

    题面 传送门 分析 此题做法很多,树形DP,DFS序+线段树,树链剖分都可以做 这里给出DFS序+线段树的代码 我们用线段树维护到根节点路径上节点权值之和的最大值,以及取到最大值的节点编号x 每次从根 ...

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

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3252 题解 有一个非常显然的贪心思路:每次选择目前走到那儿能够获得的新权值最大的点. 证明的话 ...

  5. uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心

    #139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...

  6. HDU - 6203:ping ping ping (DFS序 贪心)

    pro:给定N+1个点的树,有M对关键点,现在让你破坏最少的点,使得M对关键点不连通. sol:贪心,我们把M对点按照LCA深度排序,每次破坏LCA. 如果一对点(u,v,lca),u-lca-v有点 ...

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

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

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

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

  9. 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 ...

随机推荐

  1. MapReduce -- 最短路径

    示例: 给出各个节点到相邻节点的距离,要求算出初始节点到各个节点的最短路径. 数据: A (B,) (D,) B (C,) (D,) C (E,) D (B,) (C,) (E,) E (A,) (C ...

  2. Tomcat端口被占用解决方案

    Tomcat端口被占用解决方法 1.在dos下,输入 netstat -ano|findstr 8080 //说明:查看占用8080端口的进程,显示占用端口的进程 2.taskkill /pid 19 ...

  3. 20155202张旭 Exp3 免杀原理与实践

    20155202张旭 Exp3 免杀原理与实践 AV厂商检测恶意软件的方式主流的就三种: 基于特征码的检测 启发式恶意软件检测 基于行为的恶意软件检测 我们要做的就是让我们的恶意软件没法被这三种方式找 ...

  4. vue eslint报错解决办法

    若提示入下图时,在build / webpack.base.conf.js中, 找到 // const createLintingRule = () => ({// test: /\.(js|v ...

  5. CLR回收非托管资源

    一.非托管资源 在<垃圾回收算法之引用计数算法>.<垃圾回收算法之引用跟踪算法>和<垃圾回收算法之引用跟踪算法>这3篇文章中,我们介绍了垃圾回收的一些基本概念和原理 ...

  6. FIFO IP核

    转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...

  7. mongodump备份小量分片集群数据

    1.使用mongodump备份小量分片集群数据 如果一个分片集群的数据集比较小,可以直接使用mongodump连接到mongos实例进行数据备份.默认情况下,mongodump到非primary的节点 ...

  8. 机器学习英雄访谈录之 DL 实践家:Dominic Monn

    目录 机器学习英雄访谈录之 DL 实践家:Dominic Monn 正文 对我的启发 机器学习英雄访谈录之 DL 实践家:Dominic Monn Sanyam Bhutani 是 Medium 上一 ...

  9. 关于k8s这项大动作,预示着边缘计算迎来“开源”发展的新周期……

    在文章<最近在边缘计算领域,发生了一件足以载入物联网史册的大事…>我曾经提到Kubernetes(简称K8s)将从超大规模云计算环境,被带入到物联网边缘计算场景中. 事情有了新进展,从本周 ...

  10. PAT甲题题解-1016. Phone Bills (25)-模拟、排序

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789229.html特别不喜欢那些随便转载别人的原创文章又不给 ...