description 题面 给个树,第\(i\)个点有两个权值\(a_i\)和\(b_i\),现在求一条长度为\(m\)的路径,使得\(\frac{\sum a_i}{\sum b_i}\)最小 data range \[m\le n\le 2\times 10^5\] solution 0/1分数规划?二分吧. 二分一个值\(S\),要使得\(\frac{\sum a_i}{\sum b_i}\le S\) 那么\[\sum(a_i-Sb_i)\le0\] 把每个点的点权做成这个,然后\(D…
[COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σai/Σbi最小 题解 看到这个式子就是裸的分数规划吧... 二分一个答案\(k\),式子变成了找一条长度为\(m\)的路径(题目里面路径长度的定义是点数) 满足\(\sum a-k\sum b\le 0\). 首先直接把\(m=-1\)也就是没有限制的点直接判掉,这个东西没有任何意义. (其实\(m…
http://cogs.pro:8080/cogs/problem/problem.php?pid=vSXNiVegV 题意:给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σai/Σbi最小. 思路:二分答案得p,把每个点权值变成ai-p*bi,看是否存在长为一条长为m的路使总和<=0. tag数组表示从当前位置沿最长链走到底的值,dp数组初值表示从当前位置的重儿子走到底的值(加负号),用tag[...]+dp[..]维护从当前节点往下走若干步得到的最小值(只更新dp数组…
传送门 题意: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<…
「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 \leq n,L,R \leq 10^5\) 解题思路 : 前几天沉迷初赛来写几道数据结构恢复一下代码能力,坑填完之后可能就要开始啃思维题了QwQ. 这个题貌似长链剖分和点分复杂度都是 \(O(nlog^2n)\) 的,点分好久都没碰了,长链剖分也只有暑假里口胡了几个多校的题而已,先讲做法吧 这个题…
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们把这棵树长链剖分,每次在所有轻儿子中找深度最大的,去掉距离u小于这个深度的栈里的点,然后去计算u的重儿子 然后去掉距离u小于重儿子深度栈里的点,但是要再把u加进去,再遍历u的其他儿子 最后重新去掉u,计算答案,用直径两端当根都做一遍,取深度较大的那个 统计的话直接在外面开一个数组,弹出弹入的时候判断…
传送门 长链剖分的板子(又是乱搞优化暴力) 对于每一个点,我们定义它深度最深的子节点为它的重儿子(为什么不叫长儿子……),他们之间的连边为重边 然后长链剖分有几个性质 1.总链长为$O(n)$ 2.一个节点的$k$级祖先的子树深度必定大于等于当前节点的子树深度 以上两点稍微yy一下就能发现是对的 然后回到这道题.我们设$len[u]$为这一条长链的长度,对于每一个长链的顶点,我们维护它的1到$len[u]$级儿子以及1到$len[u]$级祖先 同时预处理找祖先的倍增数组,并预处理出1到$n$的每…
「模板」 树链剖分 HLD 不懂OOP的OIer乱用OOP出人命了. 谨此纪念人生第一次类套类. 以及第一次OI相关代码打过200行. #include <algorithm> #include <cstdio> #include <cstring> using std::swap; const int MAXN=100010,MAXM=200010; int n,m,rt,P; class HLD { public: HLD(void) { num=cnt=0; me…
dsu on tree 对于树进行轻重链剖分,对于节点 $x$ ,递归所有轻儿子后消除其影响,递归重儿子,不消除其影响. 然后对于所有轻儿子的子树暴力,从而得到 $x$ 的答案. 对于要消除暴力消除即可. 可以发现如果暴力到点 $u$ 必然是其 $u$ 到根的轻边数量,从而时间复杂度除在统计每个节点答案时其余时间复杂度为 $O(n\log n)$ . CF 600E Lomsat gelral 模板题,按上述过程模拟即可. #include<iostream> #include<cstd…
题目链接: [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\) 的子树…
题目大意 ​ 给你一棵树,求有多少个组点满足\(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\),钦定…
[CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的点有\(f_d\)个,求最大的\(f_d\),并且输出\(d\),如果有多个\(f_d\)相同,输出最小的\(d\). 题解 这个东西和深度相关,很显然可以直接用长链剖分维护,时间复杂度\(O(N)\) 这道题目要维护的东西其实也很类似于\(dsu\ on\ tree\),但是复杂度会多个\(log…
[BZOJ3252]攻略(长链剖分,贪心) 题面 BZOJ 给定一棵树,每个点有点权,选定\(k\)个叶子,满足根到\(k\)个叶子的所有路径所覆盖的点权和最大. 题解 一个假装是对的贪心: 每次选择最大的路径,然后将路径上所有点的权值清零. 那么我们可以用长链剖分来实现这个贪心. 链长改为最大的路径权值和,这样子把每条重链的权值丢进一个堆里面取\(k\)次即可. 正确性自己\(YY\)一下,发现是对的 #include<iostream> #include<cstdio> #in…
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 -  https://www.nowcoder.com/acm/contest/145/I 题意 给定一棵有 $n$ 个节点的树,问有多少个点集的直径恰好等于 $D$ . 一个点集的直径定义为该点集中距离最远的两个点的距离. 两个点的距离定义为他们在树上的最短路径经过的边数. $n\leq 10^5$ 题解 我的做法有点难写,官方…
BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. \(n,q\leq3\times10^5\). \(Solution\) \(p,a,b\)都在一条链上. 那么如果\(a\)是\(p\)的祖先,答案就是\(\min(dep[p],\ k)*(sz[p]-1)\).可以\(O(1)\)计算. 如果\(a\)在\(p\)的子树中,答案就是\(\sum…
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某些场景可以通过不同的选择支到达其他场景.所有场景和选择支构成树状 结构:开始游戏时在根节点(共通线),叶子节点为结局.每个场景有一个价值,现在桂马开启攻略之神模式,同 时攻略k次该游戏,问他观赏到的场景的价值和最大是多少(同一场景观看多次是不能重复得到价值的) “为什么你还没玩就知道每个场景的价值呢?” “我…
题目描述 给定一棵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).表示节…
题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方案数. 设f[i][j]表示i节点子树中与i距离为j的点的个数. g[i][j]表示i节点子树中有g[i][j]对点满足每对点距离他们lca的距离都是d,他们lca距离i节点为d-j 也就是说现在已经找到两个节点了,需要再在没遍历的i的子树中找到一个距离i为j的点. 那么很容易得到转移方程: ans+=f…
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N进行标号 输出 输出最大平均估值,保留三位小数 样例输入 4 2 3 1 2 1 1 3 2 1 4 3 样例输出 2.500 提示 N<=100000,1<=L<=U<=N-1,Vi<=1000000 这题算…
传送门 给树竟直接给父子关系!!!真良心 首先一个贪心策略:每一次选择的链一定是所有链中权值最大的.这应该比较显然 那么我们接下来考虑如何维护这个贪心.我们可以使用长链剖分进行维护,对权值进行长链剖分,然后取前$K$大的链权值和,就是答案了. 考虑这个贪心为什么是对的.假设我们选到了第$i$条链,意味着第$i$条链的链顶的所有祖先都一定已经被访问过了(否则它一定是其父亲的儿子中链最长的点,它就不会是链顶),所以选择这一条链的意义就是选择从根到这一条链的链底的路径. #include<bits/s…
传送门 强行二合一最为致命 第一问直接最短路+$DFS$解决 考虑第二问,与深度相关,可以考虑长链剖分. 设$f_{i,j}$表示长度为$i$,经过边数为$j$时的最大边权和,考虑到每一次从重儿子转移过来的时候,不仅要将$f$数组右移一格,还需要同时加上一个值.显然用线段树等数据结构额外维护是不现实的,我们考虑维护一个影响范围为整个$f_i$的加法标记$tag_i$,将$f_{i,0}$设置为$-tag_i$,每一次上传的时候把标记也一起上传,合并轻儿子.计算答案的时候将这个$tag$加上,就能…
题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. 每个点只会被取一次,即价值也只会被清空一次.所以每选一条链就暴力往上跳,直到到一个清空过的点,顺便在线段树上修改经过点的子树权值就可以了. 复杂度\(O((n+k)\log n)\). 实际上,每个点只被统计一次,就是选\(k\)条最长的不相交的链(链形态是从上到下的). 所以可以想到长链剖分.以…
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深度在\([L-d,R-d]\)内的最大值更新.这可以用单调队列维护. 这需要子树中的点按dep排好序.可以用BFS,省掉sort. 直接这样的话,每次用之前的子树更新当前子树时,每次复杂度是\(O(\max\{dep\})\)的(之前子树中最大的深度).能被卡成\(O(n^2\log n)\). 可…
题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\(g[x][i]\)表示\(x\)子树中,满足\(u,v\)到\(LCA(u,v)\)的距离都是\(d\),且到\(x\)的距离为\(d-i\)的点对\((u,v)\)个数.(就是不以\(x\)作为三个点的中心位置,那样就没法算了) 如图 那么就可以由\(g[x][i]\)与另一棵子树的\(f[y][…
题目链接 https://blog.bill.moe/long-chain-subdivision-notes/ http://www.cnblogs.com/zzqsblog/p/6700133.html 长链剖分模板. 6,7,8,20个点RE,没什么办法了..(迷) #include <cstdio> #include <cctype> #include <vector> #include <algorithm> #define gc() getcha…