树链剖分
EMber _
人但有追求,世界亦会让路。
展开
-
NOIP11.15模拟 T2 三部曲
。。没想到正解,大概知道是线段树,但是不知道怎么处理,出来才知道是用dfs序,也有dalao用树剖怒艹。。然而我明明打的50分结果只有30分,A了之后看了一下别人50分的做法。。感觉我就算是暴力都打的很复杂。。有很多可以简化的东西。。要学习一下。 简洁的50分做法(来自hhh)#include<iostream>#include<stdio.h>#include<string.h>#incl原创 2016-11-15 15:23:07 · 473 阅读 · 0 评论 -
JZOJ5365. 【GDOI2018模拟9.14】通信 线段树+重链剖分
我们考虑每条边的贡献。 把已经走过的点染色为1,未走过的为0,那么我们对于序号序列维护一颗线段树,x-v这条边的贡献就是序列中不连续01序列包含x的个数,那么我们反过来,答案=总序列-经过x的极大连续序列,这个东西明显可以用线段树维护,维护一个从左右开始的最长01长度和最长连续就好了。 问题是直接遍历操作明显会T,我们重链剖分一下,对于一个点,先把其他的轻儿子暴力扫掉,然后再递归处理重儿子。原创 2017-09-16 11:47:57 · 571 阅读 · 0 评论 -
bzoj3626[LNOI2014]LCA 树链剖分
Description给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。 有q次询问,每次询问给出l r z,求sigma_{l<=i<=r}dep[LCA(i,z)]。 (即,求在[l,r]区间内的每个节点i与z的最近公共祖先的深度之和)Input第一行2个整数n q。原创 2017-07-12 21:10:48 · 255 阅读 · 0 评论 -
bzoj3083 遥远的国度 树链剖分+树上lca
由于懒得重打一遍直接贴上一题的剖分模板,结果因为上一题是单点查询所以一直T,T了5发才发现我是有多sb。。明显不能直接换根,不然我全部操作都是换根你不就炸了。 假设开始的时候root,现在的根是newroot,查询的是x,那么明显有: 1.如果x=newroot,查询全部 2.如果newroot在x外,不受影响,直接查。 3.newroot在x内,查询x子树以外的,即1–pos[x]-1和m原创 2017-07-11 16:50:45 · 294 阅读 · 0 评论 -
bzoj3631[JLOI2014]松鼠的新家 树链剖分
挺简单的一道树链剖分,直接上就好了。 不能像区间和那样传标记,因为可能标记会被重复标记.#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;原创 2017-07-11 15:41:12 · 239 阅读 · 0 评论 -
bzoj2243 SDOI2011 染色 树链剖分
树剖裸题,复习一波。。一开始还看错题目了以为要维护一段区间的颜色数量。。还以为要上主席树。。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int原创 2017-04-23 11:10:19 · 211 阅读 · 0 评论 -
bzoj3694 最短路 并查集(树链剖分)
题意:给出一个图和他的最短路树,让你求不经过最短路最后一条边的最短路。 。。一开始以为直接上次短路,后来发现zz了,并不可以。。 然后%了一发题解。 其实就是要在最短路树之外找一条路径来跑。。 那么假设现在有一条非树边x-y,长度为len。 那么我们对于t=lca(x,y)(假设y在树上x不在),可以把1-i的路径转化为(i在t到y之间)1-t-x-y-i. 这样的路径长度是dis[x]原创 2017-05-10 22:04:56 · 329 阅读 · 0 评论 -
bzoj2157 旅游 树链剖分
其实就是个树链剖分,但是变成了边权而已,把边权移到他深度更大的端点上就行了。问题是操作太多了,而且还有个改变权值和取反我还要单独拉出来打。。打了半个小时,,编译调了半天,6000多B,都不想肉眼检查结果1A了。。有点窃喜。。 注意取反哪里的最大最小值的维护,要倒过来。#include<cstdio>#include<cstring>#include<iostream>#include<alg原创 2017-04-15 21:39:05 · 282 阅读 · 0 评论 -
bzoj1036 树链剖分模板
模板题,,复习一波。。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m;const int原创 2017-03-16 21:24:40 · 231 阅读 · 0 评论 -
bzoj1782[Usaco2010 Feb]slowdown 慢慢游
1A真的爽。 网上那都什么鬼玩意,看着挺复杂,有必要吗。这不就是个裸链剖讲道理。#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using nam原创 2017-04-07 11:52:10 · 216 阅读 · 0 评论 -
JZOJ5394. 【NOIP2017提高A组模拟10.5】Ping 树上差分 树状数组
题意:有一棵树,给你一些点对,要求这些点对不能联通,问最少需要拆掉多少个点。输出方案。 比赛的时候有想法的一道题目,但是由于比较煞笔所以只想到了树剖,然后觉得万一不能切就亏大了,求稳所以没打。 考虑一对点,他们的路径为x-lca-y,那么对于这条路径上查询是否有被拆掉的点,没有就直接把lca拆掉。 那么我们对于所有点对都这么干,按照dfs序倒着处理,证明的话,把树看成一个序列,会发现按照右端点原创 2017-10-05 21:54:31 · 518 阅读 · 0 评论