题目链接


使用长链剖分O(N)代替dsu on tree的O(N log(N))来解决该问题。

用到长链剖分的性质,所有长链的总和为N,所以,开出一个长度为N的数组来给长链们使用(节约空间,懒人vector也是可以)。

那么,这道题,我们要知道某个点向下X步所有的结点的个数以及向下X步所有的结点的权值和,我们利用这两条信息自然可以求解了。

所以,我开了*f[ ]指针和*g[ ]指针分别存权值和点个数对应的位置起点,两个是指针,返回的是原数组中的位置。

7 5
1 2 3 4 5 6 7
1 2
2 3
3 4
1 5
5 6
6 7
ans:20 0 0 0 0 0 0
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e5 + 7;
int N, K, head[maxN], cnt;
ll a[maxN];
struct Eddge
{int nex, to;Eddge(int a=-1, int b=0):nex(a), to(b) {}
}edge[maxN << 1];
inline void addEddge(int u, int v)
{edge[cnt] = Eddge(head[u], v);head[u] = cnt++;
}
inline void _add(int u, int v) { addEddge(u, v); addEddge(v, u); }
int len[maxN], Wson[maxN] = {0};
void pre_dfs(int u, int fa)
{for(int i=head[u], v; ~i; i=edge[i].nex){v = edge[i].to;if(v == fa) continue;pre_dfs(v, u);if(len[v] > len[Wson[u]]) Wson[u] = v;}len[u] = len[Wson[u]] + 1;
}
ll ans[maxN], tmp[maxN], smp[maxN], *f[maxN], *id = tmp, *g[maxN], *sd = smp;
void dfs(int u, int fa)
{f[u][0] = a[u]; g[u][0] = 1; ans[u] = 0;if(Wson[u]){f[Wson[u]] = f[u] + 1;g[Wson[u]] = g[u] + 1;dfs(Wson[u], u);}for(int i=head[u], v; ~i; i=edge[i].nex){v = edge[i].to;if(v == fa || v == Wson[u]) continue;f[v] = id; g[v] = sd;id += len[v]; sd += len[v];dfs(v, u);for(int j=1; j<=len[v]; j++){if(K - j >= 1 && K - j < len[u])ans[u] += g[u][K - j] * f[v][j - 1] + f[u][K - j] * g[v][j - 1];}for(int j=1; j<=len[v]; j++){f[u][j] += f[v][j - 1];g[u][j] += g[v][j - 1];}}
}
inline void init()
{cnt = 0;for(int i=1; i<=N; i++) head[i] = -1;
}
int main()
{scanf("%d%d", &N, &K);for(int i=1; i<=N; i++) scanf("%lld", &a[i]);init();for(int i=1, u, v; i<N; i++){scanf("%d%d", &u, &v);_add(u, v);}pre_dfs(1, 0);f[1] = id; id += len[1]; g[1] = sd; sd += len[1];dfs(1, 0);for(int i=1; i<=N; i++) printf("%lld%c", ans[i], i == N ? '\n' : ' ');return 0;
}

旗鼓相当的对手【长链剖分】相关推荐

  1. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)

    题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...

  2. Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)

    题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...

  3. BZOJ4381[POI2015]Odwiedziny——分块+长链剖分

    题目描述 给定一棵n个点的树,树上每条边的长度都为1,第i个点的权值为a[i]. Byteasar想要走遍这整棵树,他会按照某个1到n的全排列b走n-1次,第i次他会从b[i]点走到b[i+1]点,并 ...

  4. 【Cf Edu #47 F】Dominant Indices(长链剖分)

    要求每个点子树中节点最多的层数,一个通常的思路是树上启发式合并,对于每一个点,保留它的重儿子的贡献,暴力扫轻儿子将他们的贡献合并到重儿子里来. 参考重链剖分,由于一个点向上最多只有$log$条轻边,故 ...

  5. 长链剖分:O(nlogn)预处理O(1)求kth祖先

    前言 一个长链剖分的小trick 问题 如题,数据范围大概10510^5105 思路 我们知道重链剖分是什么,即选择自己儿子中子树节点树最大的作为重儿子,其它儿子为轻儿子 而长链剖分则是选择儿子中子树 ...

  6. 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

    [UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...

  7. 【THUSC2018】史莱姆之友【长链剖分】【链分治NTT】

    不知道这题能不能发出来,如果不能请联系我,我什么都会做的 题意:给一棵 nnn 个结点的树,每个结点有个 ax+bax+bax+b,求所有根到叶子的乘积之和.系数模 99824435399824435 ...

  8. 【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】

    题意:给一棵 nnn 个点的树,求两两距离相等的三元组个数. n≤105n\leq 10^5n≤105 显然相当于是找一个点到这三个点距离相等.子树内和子树外到当前点的距离为某个值的点的个数可以长链剖 ...

  9. 【十二省联考2019】希望【点边容斥】【换根dp】【长链剖分】【线性数据结构】【回退数据结构】【离线逆元】

    题意:给一棵树,两个参数 k,Lk,Lk,L,需要选择 kkk 个连通块,使得这 kkk 个连通块存在一个公共点,且该公共点到 kkk 个连通块内的任意一点的距离不超过 LLL,求方案数 模 9982 ...

最新文章

  1. overflowhidden用法思考
  2. arcgis api for javascript 距离与面积量算
  3. JavaWeb(一)——web服务器、Tomcat安装和配置
  4. Github 1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch
  5. python中 lambda, map ,filter ,reduce讲解
  6. Python基础知识点总结
  7. 实验5 函数程序设计 6-8 使用函数求最大公约数
  8. 1001. 温度转换
  9. elementui el-dialog 离顶部的位置_驻马店建筑物避雷带的安装位置,本月报价
  10. 苹果应用上架,图片的要求(2017年4月27日)
  11. soapui返回值类型都有哪些_法兰的类型都有哪些以及法兰的设计
  12. mysql注入原理_Mysql报错注入原理分析
  13. xor(线性基的合并)
  14. ACE_Reactor学习1 总体计划
  15. SQL SERVER 2008 “阻止保存要求重新创建表的更改”
  16. java格式化数字 NumberFormat及DecimalFormat
  17. JavaScript — 原生js实现上传图片控件
  18. 诚龙网刻报错_诚龙网刻图文教程
  19. js 微信端 信息一键导入 通讯录
  20. Windows Server2012搭建Git服务器

热门文章

  1. 自己数据库被攻击还被勒索了全过程
  2. Elasticsearch生态技术峰会 | Elasticsearch在清博大数据的应用与实践
  3. Android签名打包很慢,Android APK快速签名—优化打包时间
  4. 赵氏孤儿案--找到编程的兴趣点
  5. 企业为什么要开通银企直联_胜意费控云 | 什么是银企直联,它有什么作用?
  6. ANTLR4入门(三):使用mave ANTLR4插件(antlr4-maven-plugin)执行语法解析生成器
  7. Tensorflow基于pb模型进行预训练(pb模型转CKPT模型)
  8. ie浏览器主页被毒霸锁定,解决
  9. 心生热爱,所以只身前来 | Allan,很高兴再认识你
  10. 2012系统sntp服务器,如何设置SNTP服务器,实现同步PLC时钟