题目描述 给定一棵n个点的树,树上每条边的长度都为1,第i个点的权值为a[i].Byteasar想要走遍这整棵树,他会按照某个1到n的全排列b走n-1次,第i次他会从b[i]点走到b[i+1]点,并且这一次的步伐大小为c[i].对于一次行走,假设起点为x,终点为y,步伐为k,那么Byteasar会从x开始,每步往前走k步,如果最后不足k步就能到达y,那么他会一步走到y.请帮助Byteasar统计出每一次行走时经过的所有点的权值和. 输入 第一行包含一个正整数n(2<=n<=50000).表示节…
[UOJ#33][UR #2]树上GCD(长链剖分,分块) 题面 UOJ 题解 首先不求恰好,改为求\(i\)的倍数的个数,最后容斥一下就可以解决了. 那么我们考虑枚举一个\(LCA\)位置,在其两棵不同的子树中选择两个点,那么贡献就是这两段的\(gcd\). 那么发现要统计的东西类似于\(u\)的子树中,深度为\(d\)的点的个数,这个可以很容易的用长链剖分来维护,那么维护出这个数组之后就可以\(O(\log {dep})\)的对于贡献进行计算.然而这个复杂度是假的,因为你每次都需要一次\(O…
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. 所以我们需要找到对于每个点$u$距离它最远的点及最小的距离$x$满足距离$u$的距离大于等于$x$的点都只有一个. 那么怎么找距离每个点最远的点? 这个点自然就是树的直径的一个端点了! 我们将树的直径先找到,然后讨论一下对于每个点,有哪些点可能会被计入答案: 如图所示,我们以点$x$为例,假设它距…
传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点的方案数.原因是:对于每一种合法方案,集合点一定是树上的一个连通块,满足\(n=m+1\).算点时,这种方案被算了\(n\)次:算边时,这种方案被算了\(m=n-1\)次,所以每一个方案都恰好被算了一次. 有\(DP\):设\(f_i-1\)表示选择了包含\(i\)和\(i\)的子树中的点的一个连通…
题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为三个不同的点,\(p, a\) 都为 \(b\) 的祖先,且 \(p\) 到 \(a\) 的距离不能超过 \(k\) . \(n\le 300000 , q\le 300000\) 不要求强制在线. 题解 令 \(dep[u]\) 为点 \(u\) 的深度,\(sz[u]\) 为 \(u\) 的子树…
传送门 题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi​∑ai​​的最大值. 思路:一眼要01分数规划,考虑checkcheckcheck可以用点分治水掉. 然而也可以用长链剖分,复杂度降低一个logloglog. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int rlen=1<…
题目大意 ​ 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) ​ \(1\leq n\leq 100000\) 题解 ​ 问题转换为有多少个组点满足\(dist_{i,x}=dist_{i,y}=dist_{i,z}\) ​ 我们考虑树形DP ​ \(f_{i,j}=\)以\(i\)为根的子树中与\(i\)的距离为\(j\)的节点数 ​ \(g_{i,j}=\)以\(i\)为根的子树外选择一个…
题面 给定一棵树,每次询问一个点的\(k\)次祖先,强制在线. Vijos 题解 长链剖分. 链接暂时咕咕咕了. 现在可以戳链接看题解了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<vector> using namespace std…
[BZOJ4543]Hotel加强版(长链剖分) 题面 BZOJ,没有题面 洛谷,只是普通版本 题解 原来我们的\(O(n^2)\)做法是设\(f[i][j]\)表示以\(i\)为根的子树中,距离\(i\)的深度为\(j\)的点的个数,这样子可以每次在\(LCA\)处合并答案. 然后长链剖分优化一下,就变成了\(O(n)\)的??? 写的详细写的题解 玄学的指针我也没太懂啊....我才不会说我代码是照着题解打的 upd:之前的代码蒯错了,我去BZOJ把过了的代码再蒯一遍 #include<ios…
[BZOJ3653]谈笑风生(长链剖分) 题面 BZOJ 洛谷 权限题啊.... 题解 首先根据题目给的条件,发现\(a,b\)都要是\(c\)的父亲. 所以这三个点是树上的一条深度单增的链. 因为\(a,b\)之间距离不超过\(k\),并且\(a\)被钦定了,所以只有两种情况: 一种是\(a\)是\(b\)的祖先,贡献是\(\sum_b size[b]-1\),也就是所有\(b\)可以选择的点的子树和. 另外一种\(b\)是\(a\)的祖先,贡献是\(\sum_b size[a]-1\),钦定…