树链剖分
LowestJN
强省弱OIer
展开
-
[POI][BZOJ4381]Odwiedziny 访问
题目大意给定一课NN个节点数,有MM个询问,询问从uu点每次跳kk个点到vv点经过的点权和。令ff为u,vu,v的lca,那么uu到vv的路径可以分成uu到ff再到vv对于每一个节点xx,令g(x,k)g(x,k)为从xx每次跳kk步到根节点的点权和,fa(x,k)fa(x,k)为xx往上走kk步的祖先,其中k<=n√k<=\sqrt{n},那么如果步伐k<=n√k<=\sqrt{n},答案就可以O原创 2016-12-11 22:20:49 · 548 阅读 · 0 评论 -
[BZOJ4127][树链剖分][线段树][乱搞]Abs
题意给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和想了半天不会做…… 搜了发题解因为d非负,所以最多n次有一个从负数变成正数,那么用线段树记录一下区间中最大的负数,当这个最大负数加上d后变成正数的时候,继续往下update,因为最多只会有n次,所以复杂度也是nlogn级别的#incl原创 2017-03-02 20:49:15 · 516 阅读 · 0 评论 -
[BZOJ2325][ZJOI2011][树链剖分][线段树]道馆之战
调了一个晚上 代码又臭又长为什么zjoi2011的题目都是代码量那么大的题…考虑在一条链上的情况,可以用线段树记录一个区间的八个值-从左端点的A往右走的最大步数 -从左端点的B往右走的最大步数 -从右端点的A往左走的最大步数 -从右端点的B往左走的最大步数 -从右端点的A到左端点的A或从左端点的A到右端点的A的最大步数 -从右端点的A到左端点的B或从左端点的B到右端点的A的最大步数 -原创 2017-03-13 21:54:40 · 846 阅读 · 0 评论 -
[分治最短路 && 树链剖分]Codechef September Challenge 2017 QGRID. Querying on a Grid
传送门 代码能力大屠杀系列 挺套路的题。 这个一个网格图,mm 只有3,那么第一想法就是对网格图分治。 对于分治到的区间 [l,r][l,r] ,令 mid=l+r2mid={l+r\over 2} ,就是中线。我们可以对中线上的 mm 个点各做一遍最短路,如果一个修改操作的两个点 x,yx,y 的最短路径在这个区间内,又跨越了中线,那么这个最短路径肯定要经过中线上的 mm 个点之一。所以我原创 2017-09-13 19:06:11 · 492 阅读 · 0 评论 -
[树链剖分 线段树] Codeforces 860E. Arkady and a Nobody-men
按照深度从小大加入,就是一个很典型的熟练剖分加线段树实现路径修改、询问的模型复杂度是 O(nlog2n)O(n\log^2n)最后一个点加个标记永久化、记忆化什么的卡一卡才能过…#include <cstdio>#include <iostream>#include <algorithm>#include <cmath>#include <vector>#include <set>#in原创 2017-10-18 12:28:56 · 492 阅读 · 0 评论 -
[树链剖分 李超线段树] BZOJ4515 [Sdoi2016] 游戏
链剖以后就跟数列的做法一样了这题是区间覆盖区间查询,所以还要记一下区间里所有函数的最小值#include <cstdio>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int N=100010;int n,m,cnt,tt,G[N],dpt[N],id[N<<2];ll原创 2017-12-13 17:43:08 · 582 阅读 · 0 评论 -
[长链剖分 & 线段树] BZOJ1758[Wc2010] 重建计划
学一发长链剖分 原来以前在ATCODER上做的一题就是这个套路…#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=100010;int n,U,D,cnt,dpt[N],d[N],G[N],son[N],fa[N];struct edge{ int t,nx;原创 2018-01-02 10:59:26 · 465 阅读 · 0 评论 -
[主席树 链剖] LOJ#6073. 「2017 山东一轮集训 Day5」距离
刚开始想了一个很naive的分块加虚树的做法,不管时空复杂度还是代码复杂度都巨大可以把问题转发成求 ∑i∈path(u,root)dis(pi,k)\sum_{i\in path(u,root)}dis(p_i,k)再推一下式子就得到 ans=∑i∈path(u,root)dis(pi)+depthu×dis(k)−2∑i∈path(u,root)dis(lca(i,k))ans=\sum原创 2018-01-18 09:58:56 · 510 阅读 · 0 评论 -
[链剖 FFT] LOJ#6289. 花朵
树形DP的转移是一个卷积的转移形式可以先链剖,一个点的轻儿子先合并,然后一条重链用分治FFT合并#include <cstdio>#include <iostream>#include <algorithm>#include <vector>#include <queue>using namespace std;...原创 2018-03-05 10:34:14 · 599 阅读 · 0 评论