分析:一个贪心的想法是每次找到根的点权和最大的点进行操作,关键是怎么维护.每次找最大值,修改后会对这条链上每个点的子树上的点造成影响,可以用线段树来维护.找最大值就是区间求最大值嘛,对子树进行操作利用dfs序维护一下就好了.记录一下最大值的位置,每次从这个位置向上跳并对它的子树进行修改直到当前点的点权为0.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ;
typedef long long ll; int n, k, a[maxn], fa[maxn],head[maxn], to[maxn], nextt[maxn],tot = , d[maxn], l[maxn], r[maxn], pos[maxn], dfs_clock;
int maxx[maxn << ], tag[maxn << ], p[maxn << ];
ll ans; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(int u, int from, int dist)
{
d[u] = dist;
l[u] = ++dfs_clock;
pos[dfs_clock] = u;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
if (v != from)
{
dfs(v, u, dist + a[v]);
fa[v] = u;
}
}
r[u] = dfs_clock;
} void pushup(int o)
{
if (maxx[o * ] > maxx[o * + ])
{
maxx[o] = maxx[o * ];
p[o] = p[o * ];
}
else
{
maxx[o] = maxx[o * + ];
p[o] = p[o * + ];
}
} void build(int o, int l, int r)
{
if (l == r)
{
maxx[o] = d[pos[l]];
p[o] = pos[l];
return;
}
int mid = (l + r) >> ;
build(o * , l, mid);
build(o * + , mid + , r);
pushup(o);
} void pushdown(int o)
{
if (tag[o] != )
{
tag[o * ] += tag[o];
tag[o * + ] += tag[o];
maxx[o * ] += tag[o];
maxx[o * + ] += tag[o];
tag[o] = ;
}
} void update(int o, int l, int r, int x, int y,int v)
{
if (x <= l && r <= y)
{
maxx[o] += v;
tag[o] += v;
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update(o * , l, mid, x, y, v);
if (y > mid)
update(o * + , mid + , r, x, y, v);
pushup(o);
} void change(int x)
{
while (a[x])
{
update(, , n, l[x], r[x], -a[x]);
a[x] = ;
x = fa[x];
}
} int main()
{
scanf("%d%d", &n, &k);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
for (int i = ; i < n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
dfs(, , a[]);
build(, , n);
for (int i = ; i <= k; i++)
{
ans += maxx[];
change(p[]);
}
printf("%lld\n", ans); return ;
}

最新文章

  1. Java并发编程:synchronized
  2. phpcms v9 0day
  3. C/C++程序员必须熟练应用的开源项目[转]
  4. Spring事务解析3-增强方法的获取
  5. 分布式Hbase-0.98.4在Hadoop-2.2.0集群上的部署
  6. IBM的IT战略规划方法论
  7. PRML读书会第三章 Linear Models for Regression(线性基函数模型、正则化方法、贝叶斯线性回归等)
  8. pl/sql programming 15 数据提取
  9. android重写view和viewgroup的区别
  10. C# winform 选择项 省市连动
  11. SecureCRT使用教程
  12. mybatis0204 一对多查询
  13. js数组(列表)的基本操作
  14. 优化C#程序的48种方法
  15. GitLab搭建详细过程
  16. CSS伪元素:before/CSS伪元素:before/:after content 显示Font Awesome字体图标:after content 显示Font Awesome字体图标
  17. 浅谈工作单元 在整个 ABP 框架当中的应用
  18. j收集ava面试题
  19. java中异常处理
  20. mysql encode decode加密和解密

热门文章

  1. AngularJs 的ng-include指令的使用
  2. HDU 5996 博弈
  3. Android习惯——给全部Activity添加集合管理
  4. spring 配置 shiro rememberMe
  5. iOS地图----MapKit框架
  6. 阿里云服务器基本搭建_错误1_Permission denied (publickey)
  7. Vim中文编码问题
  8. Flask框架 之数据库扩展Flask-SQLAlchemy
  9. 打开windows服务
  10. [WDS] Warnings while compiling. vue项目运行控制台输出太多警告信息