树链剖分
gjghfd
这个作者很懒,什么都没留下…
展开
-
bzoj3626 [ LNOI2014 ] -- 树链剖分
直接复制gconeice的题解吧 显然,暴力求解的复杂度是无法承受的。考虑这样的一种暴力,我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第一个有标记的点求出它的深度统计答案。观察到,深度其实就是上面有几个已标记了的点(包括自身)。所以,我们不妨把 z 到根的路径上的点全部 +1,对于 l 到 r 之间的点询问他们到根路径上的点权和。仔细观察上面的暴力不难发现,实际上这个原创 2017-05-26 16:46:02 · 212 阅读 · 0 评论 -
bzoj1036 [ ZJOI2008 ] --树链剖分
模板题。。。#include#include#includeusing namespace std;#define N 30001#define INF 1000000000inline char Nc(){ static char buf[100000],*p1=buf,*p2=buf; if(p1==p2){ p2=(p原创 2017-05-26 16:40:15 · 218 阅读 · 0 评论 -
bzoj4712 -- 树链剖分
题解:http://www.cnblogs.com/clrs97/p/6006305.html 代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 200010 8 #define ll long long 9 #def原创 2017-05-26 16:45:43 · 410 阅读 · 0 评论 -
codeforces768G The Winds of Winter -- 树上启发式合并
题目链接题目大意:给定一棵树,对于树上每个结点,将它删去,然后你可以将得到的森林中任意一棵树的一个点与其父亲断开并连接到另一颗树上。求森林中所有树sizesize最大值的最小值。先考虑怎么求一个点的答案。令sizeisize_i表示点ii的子树和,minmin表示森林中最小的树的大小,maxmax表示森林中最大的树的大小。那么我们可以二分答案ansans,问题就转化为最大的树中是否存在一个点ii,使原创 2017-07-11 17:25:51 · 860 阅读 · 0 评论 -
bzoj2588 -- 树链剖分+主席树
先将权值离散。显然可以对于每个结点建一棵权值线段树存这个点到根结点的路径上的点权,询问时在线段树上二分,但这样时间是O(n2log2n)的。然后想到用主席树优化,时间复杂度O(n*log2n)。 代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #defi原创 2017-05-26 16:45:47 · 552 阅读 · 0 评论 -
codeforces838B Diverging Directions -- 树链剖分 + 线段树
令 aia_i 表示从 ii 到根的边的长度。对于每个点维护 distidist_i 表示从根到 ii 的路径, mindistimindist_i 表示 ii 的子树中 distj+ajdist_j+a_j 的最小值。 然后对于询问 (u,v)(u,v) 分类: 如果 uu 是 vv 的祖先,由于权值都是正整数,答案为distv−distudist_v-dist_u。 否则答案为mindis原创 2017-08-18 21:13:41 · 548 阅读 · 0 评论 -
codeforces600E Lomsat gelral -- 树上启发式合并
显然加入和删除点可以O(1)O(1)维护。先做一次树剖,然后从根开始dfsdfs一遍。dfsdfs到一个点时加入答案。对于每个点如果是轻儿子回溯时删除,否则不删除。统计答案时暴力dfsdfs一遍所有轻儿子。原创 2017-07-10 17:02:44 · 481 阅读 · 0 评论 -
Codechef June Challenge 2017 #Persistent oak -- 树链剖分+主席树
传送门每个点维护一下还能承受多少重量,线段树维护区间最小值就可以了。 如果一个子树全部折断,可以直接把初始版本的主席树接过来。代码:#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>using namespace std;inline char nc(){原创 2017-09-15 20:50:28 · 326 阅读 · 0 评论 -
[ 树链剖分 后缀自动机 ] Codeforces504E Misha and LCP on Tree
对原树树链剖分,那么一条链可以表示成 O(logn)O(logn)O(\log n) 段区间。然后问题就转化为求两段区间的 lcplcplcp ,将每条重链正反都加入一个字符串中,构建出后缀自动机,求 lcalcalca 即可。 时间复杂度 O(nlogn+mlog2n)O(nlogn+mlog2n)\mathcal{O}(n\log n+m\log^2 n) 。#include<...原创 2018-03-30 19:52:27 · 328 阅读 · 0 评论