题意:

  给出一颗有点权和边权的树。求每一个点u的子树中有多少点v,使得点v到点u的距离小于等于点v的权值。

题解:

  对于每一个点,倍增的预处理出他的祖宗节点及距离。根据预处理的结果求出每个点能到的最远的祖宗节点。

  设点u能到的最远祖宗节点为v。利用差分的思想在点tree[u]+1,点tree[v]-1。

  最后每个点的答案就是子树的tree[]和。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e5+;
int t, n, u, v, tree[maxn], ans[maxn];
ll c, x[maxn];
struct node {
ll val; int nod;
};
node fa[][maxn], tmp;
vector<node> g[maxn];
void dfs(int u, int pre) {
fa[][u].nod = pre;
int len = g[u].size();
for(int i = ; i < len; i++) {
int v = g[u][i].nod;
if(v==pre) {
fa[][u].val = g[u][i].val;
continue;
}
dfs(v, u);
}
}
void dfs_double(int u, int pre) {
int len = g[u].size();
for(int i = ; i < len; i++) {
int v = g[u][i].nod;
if(v==pre) continue;
dfs_double(v, u);
}
tree[u]++;
ll tv = x[u];
for(int k = ; k >= ; k--) {
if(fa[k][u].val <= tv) {
tv -= fa[k][u].val;
u = fa[k][u].nod;
}
}
tree[u]--;
}
void solve(int u, int pre) {
int len = g[u].size();
for(int i = ; i < len; i++) {
int v = g[u][i].nod;
if(v==pre) continue;
solve(v, u);
}
for(int i = ; i < len; i++) {
int v = g[u][i].nod;
if(v==pre) continue;
ans[u] += tree[v]+ans[v];
}
}
int main() {
freopen("car.in","r",stdin);
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
memset(tree, , sizeof(tree));
memset(ans, , sizeof(ans));
for(int i = ; i <= n; i++) g[i].clear();
for(int i = ; i <= n; i++) scanf("%lld", &x[i]);
for(int i = ; i < n; i++) {
scanf("%d%d%lld", &u, &v, &tmp.val);
tmp.nod = v;
g[u].push_back(tmp);
tmp.nod = u;
g[v].push_back(tmp);
}
dfs(, );
for(int k = ; k < ; k++) {
for(int v = ; v <= n; v++) {
fa[k+][v].nod = fa[k][fa[k][v].nod].nod;
fa[k+][v].val = fa[k][v].val+fa[k][fa[k][v].nod].val;
}
}
dfs_double(, );
solve(, );
for(int i = ; i <= n; i++) {
printf("%d", ans[i]);
if(i==n) puts("");
else printf(" ");
}
}
}

最新文章

  1. nexus 社区版3.0.2部署、访问
  2. 【转】如何让你的Android SDK下载或者升级快如闪电
  3. Python爬虫学习(5): 简单的爬取
  4. 安装生物信息学软件-HUMAnN2
  5. Dynamics AX 2012 R2 AIF自定义服务中的事务回滚Bug
  6. 当BPM业务流程管理遇上制造业
  7. Android渗透测试Android渗透测试入门教程大学霸
  8. 【Thread】多线程的异常处理?
  9. druid parser
  10. Android 教你打造炫酷的ViewPagerIndicator 不仅仅是高仿MIUI
  11. nodejs 包引用的终极结论
  12. ABP架构学习系列二:ABP中配置的注册和初始化
  13. PHP两个日期之间的所有日期
  14. linux卸载openjdk
  15. 【中文版 | 论文原文】BERT:语言理解的深度双向变换器预训练
  16. virtualenv virtualenvwrapper 虚拟环境创建
  17. jQuery 批量操作checkbox
  18. C# unity 的 IInterceptionBehavior实现aop拦截器
  19. cocos2d-x 相关文章资源(安卓开发)
  20. 003PHP文件处理——目录操作:rename scandir

热门文章

  1. mpvue重构小程序之坑点1
  2. 提高篇(1):RMQ问题与ST表
  3. BZOJ1202: [HNOI2005]狡猾的商人(带权并查集)
  4. 网页弹出[Object HTMLDivElement],怎么取值?
  5. Linux实战教学笔记05:远程SSH连接服务与基本排错
  6. 文件权限管理命令chmod,chown与文本搜索命令grep
  7. Lucene简单总结
  8. input标签中的name
  9. java 二进制、位运算、和移位运算符(2013-07-30-bd 写的日志迁移
  10. C++基础 C++对类的管理——封装