树链剖分
wJs9528-1
这个作者很懒,什么都没留下…
展开
-
HDU 3966 Aragorn's Story (树链剖分 基于点权)
树链剖分模板+树状数组区间更新单点查询#include#include#include#include#pragma comment(linker, "/STACK:1024000000,1024000000");using namespace std;#define maxn 100005int val[maxn];int u[maxn],v[maxn],fir原创 2016-07-16 21:40:55 · 775 阅读 · 0 评论 -
树链剖分小结及题目
我们经常会遇到这样一类题目:给出一棵树,询问树上u,v两点路径间的最值,合值,更新u,v路径上的点权或边权,或者区间更新etc,此时如果单纯的用线段树或者树状数组去搞,很明显问题不能够得到完美解决,此时就需要更高级的数据结构去对树进行重新构造,也就是通常说的树链剖分。一.树链剖分树链剖分,顾名思义,也就是对树的每一条链进行剖分,将一棵树拆分成若干条链,对其进行重新编号,在进行了重新编原创 2016-08-04 10:28:22 · 3710 阅读 · 0 评论 -
BZOJ 3531 (树链剖分,线段树动态开点)
首先读完题,仔细观察一下,如果按照常规写法,那么对于每一个宗教来说都应该储存当前宗教下所有城市的评价,即建立C棵线段树去维护宗教下的所有城市,但是这里如果直接开数组维护很明显会爆内存,观察到由于每个宗教来说并不是所有城市都为有效值,而只是部分城市,考虑到这一点,可以选择动态的在线段树上开结点去维护城市评价。对于动态开结点的操作,我是这么处理的,首先开一个大数组表示结点,前100000个表示宗教原创 2016-08-02 21:27:31 · 1003 阅读 · 0 评论 -
HDU 3801 Query on a tree(树链剖分离线处理)
题意:给出一棵树,询问从x点到1点路径上小于等于y的最大值分析:建一棵空树,离线处理更新边权和答案#include#include#include#include#include#include#include#include#include#include#pragma comment(linker, "/STACK:1024000000,102400原创 2016-08-02 09:16:21 · 545 阅读 · 0 评论 -
HDU 5052 Yaoge’s maximum profit (树链剖分 + 线段树)
题意:简单来说,就是求树上从s到t点之间的所有点中后面某点的权值减去前面某点的权值最大差值分析:读完题马上看到树上两点路径就能想到是树链剖分去处理(不会LCT,只好写树剖了T_T),外加线段树区间合并,区间更新去处理权值的更新,关键是查询部分,由于每次查询的两点是有方向的,所以这里需要用一个标记,标记我在向上爬点的时候是从哪个方向到哪个方向,然后再处理结果,细节比较多,重写了一边才过原创 2016-07-22 11:04:43 · 714 阅读 · 0 评论 -
HDU 4718 The LCIS on the Tree (树链剖分 + 线段树区间合并)
题意:给出一棵树,树上的每个点有权值,m次询问从u到v两点路径上最大的LCIS值是多少分析:熟练剖分解决两点路径的移动问题关键还是在于线段树的区间合并和爬树时的区间方向问题我是这么处理这个过程的,对于每个区间,记录每个区间的 Lval(左端点值),Rva(右端点值),LL(以左端点为起点的下降最大LCIS值),LR(以左端点为起点的上升最大LCIS值),RL(同上),RR(同上原创 2016-08-01 20:44:13 · 894 阅读 · 0 评论 -
HDU 5029 Relief grain(恶心的树链剖分 + 线段树)
题意:n个村庄分配粮食,m次分配,每一次分配树上的l~r区间村庄内某种粮食*1,询问每个村庄最多粮食数量的种类是什么分析:首先注意到题目要求在树上的路径分配粮食,很容易想到用树链剖分和线段树去处理区间查找过程如果此时强行将每个区间内的粮食数量及种类全部存下来,很明显内存会爆掉,试过了。。。此处则行不通,也是关键要解决的问题稍微观察一下,注意到没有更新操作,完全可以离原创 2016-07-20 19:36:45 · 597 阅读 · 0 评论 -
BZOJ 4034 T2 (树链剖分解决子树问题)
树链剖分有这样一个性质,即在剖完之后每个结点下面子树的编号一定是连续的,那么基于这一点,我们记录每个结点的区间就能解决子树更新问题dfs序也可以解决子树问题,但是这里需要计算一个贡献值,结点的层数不好处理。#include#include#include#includeusing namespace std;#define maxn 200004int fir原创 2016-08-01 08:33:44 · 1159 阅读 · 0 评论 -
BZOJ 4196 软件包管理器(树链剖分子树)
树链剖分同时记录子树区间对于install操作,直接爬上根结点,进行更新查询操作对于unstall操作,直接询问子树区间,更新子树区间#include#include#include#include#include#include#include#include#include#include//#pragma comment(linker, "/STA原创 2016-08-03 20:26:25 · 535 阅读 · 0 评论 -
LightOJ 1348 Aladdin and the Return Journey (树链剖分)
树链剖分基础题#include#include#include#include#include#include#include#include#include#include//#pragma comment(linker, "/STACK:1024000000,1024000000");using namespace std;#define INF 0x3原创 2016-07-18 10:41:31 · 477 阅读 · 0 评论 -
FZU 2082 过路费(树链剖分)
很基础的树链剖分练习+树状数组#include#include#include#include#include#include#include#include#include#include//#pragma comment(linker, "/STACK:1024000000,1024000000");using namespace std;#define原创 2016-07-18 10:03:12 · 575 阅读 · 0 评论 -
HYSBZ 1036 树的统计Count (树链剖分 + 线段树)
看到一些求树上两结点之间的路径问题,马上就想到了树链剖分,再结合线段树或者树状数组搞一搞#include#include#include#include#include#include#include#include#include#include//#pragma comment(linker, "/STACK:1024000000,1024000000");原创 2016-07-18 09:18:02 · 534 阅读 · 0 评论 -
HYSBZ 2243 染色(树链剖分 + 线段树区间合并)
简单说下询问的处理方法,对于两个点来说,每一次向上查询的结果依次倒序合并,那么这样我们就得到了两个指向相向的结构体,此时就只需要判断两个的左端点来决定答案即可这题代码长,细节也很多,找BUG找的恶心#include#include#include#include#include#include#include#include#include#include原创 2016-07-17 22:41:01 · 577 阅读 · 0 评论 -
uva 12655 (树链剖分+生成树 好题)
题意:给出一张图,s次询问求两点间所有路径中最大的最小值分析:首先看到的是一张图,看上去貌似和树无关,仔细想想求两点间路径的最小值如何求,和什么有关,首先想到能不能离线处理,这样一想之后发现其实如果我们让大边先去建图,一直到建成一棵生成树,那么是不是两点间的答案就唯一确定了,很明显是的,因为此时小边已经排除在外了,那么如果有相同权值边会不会影响结果,很明显也不会,因为我们是按照原创 2016-07-27 16:49:49 · 552 阅读 · 0 评论 -
POJ 3237 Tree(树链剖分 线段树区间标记)
题意:一棵树三种操作1.改变某条边的权值2.a到b的路径取反3,询问a到b路径上的最大值分析:树链剖分线段树维护最大最小值,标记取反代码量大#include#include#include#include#include#include#include#include#include#include//#pragma commen原创 2016-07-17 16:37:53 · 515 阅读 · 0 评论 -
POJ 2763 Housewife Wind (树链剖分)
题意:一棵树,两种操作,0.询问两点间距离,1.修改某条边权值树链剖分+树状数组单点更新区间查询#include#include#include#include#include#include#include#include#include#include//#pragma comment(linker, "/STACK:1024000000,10240原创 2016-07-17 14:46:28 · 216 阅读 · 0 评论 -
SPOJ QTREE (树链剖分 基于边权)
对于边来说,一棵树上除了根节点,每一个结点都唯一对应了一条边,那么就很好将边转换为点的问题了树链剖分+线段树注意根节点查询时候的取舍问题#include#include#include#include#include#include#include#include#include#include//#pragma comment(linker, "/STAC原创 2016-07-17 12:58:34 · 1366 阅读 · 0 评论 -
CodeForces 208E Blood Cousins(树剖求lca + dfs序)
题意: 给出若干棵树,q次询问,每次询问某结点n向上k步的父节点的子树中有多少个和n是兄弟结点(深度相同) ps:这里的题意是将问题简化过后的 假设现在只有一棵树,首先考虑结点的子树如何确定,dfs序可以解决,再考虑向上k步的lca如何解决,倍增法求lca(弱不会),由于只会树剖向上爬,外加上树剖可以直接处理dfs序,所以就写树剖了…对于子树内符合条件的结点,只需要开10510^5个深度的ve原创 2016-09-02 10:31:21 · 531 阅读 · 0 评论