![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
litble
Away From OI已久,一天天变菜中,博客平时不咋看,也没能力答疑和改错了,因此不会互动见谅orz
展开
-
洛谷P5210/loj2570 [ZJOI2017]线段树 处理广义线段树的一类方法
题目分析处理广义线段树的一类套路方法。首先,定义原来的线段树为原树,并且将其改造一下,使得它能够管理的区间为[0,n+1][0,n+1][0,n+1]。定义左偏树(跟一种可并堆重名了2333)为一棵将原树上,所有是左儿子的点提取出来,构成的一棵树,每个点的父亲,是代表在其左边,与其代表区间相邻的区间,且深度比它浅的节点。画出来是这样的:定义右偏树为提取右儿子们,与在它右边深度比它浅的第一...原创 2019-06-26 15:55:18 · 1246 阅读 · 0 评论 -
HDU5960 可持久化左偏树 k短路问题
题目大意有一堆项目,每个项目有三个权值(cost0,cost1,color)" role="presentation">(cost0,cost1,color)(cost0,cost1,color)(cost_0,cost_1,color),你要选择一些项目顺序执行,并给出你总花费的计算方式,求花费第k 大的工作方式.题目分析建图转化为求k短路的话,必须要把权值取相反数,然后答案原创 2018-01-26 13:31:20 · 1009 阅读 · 0 评论 -
bzoj4539/洛谷P3248/loj2050 树 倍增lca+主席树
我们要完成两个操作:插入和询问。 并且大树和模板树两块都要资磁倍增lca和获取两点间距离,这个很好实现。插入: 1.每一次从模板树上搞点到大树上,看作添加一个大点 (就是一棵子树)。我们要搞出一个b1,表示大点的根节点在模板树上的编号,一个b2,表示根节点在大树上的编号,一个ff,表示根节点的父亲在大树上的编号。 2.在大树上连边,边权是两个大点的根节点之间的距离。 在计算这个距离的时...原创 2018-03-26 18:40:28 · 337 阅读 · 0 评论 -
bzoj4134 ljw和lzr的hack比赛 trie树合并
题目分析首先,我们删掉所有被Hack的点,剩下的点的父亲,为原树上它的第一个没有被Hack的祖先。则产生了一个森林。那么对于这个游戏局面,sg值为每棵树的sg值的异或和。现在考虑一棵树的sg怎么算。记g(x)g(x)g(x)为在这棵树中选一个节点xxx,将xxx与其祖先全部删除,剩下的子树们的sg异或和。那么该树中所有g(x)g(x)g(x)的mex就是该树的sg。我们发现,假设我们现在在...原创 2018-09-29 20:55:51 · 282 阅读 · 0 评论 -
bzoj3064/洛谷P4314 CPU监控 线段树
题目分析看到这道题,你一定想到要新开一款和历史有关的标记…… 但是这个标记很不好合并…… 所以就有一种独特的打标记法…… 就是一个标记tag,它是一个数对(a,b)(a,b)(a,b),表示这个区间内所有值都要变成max(v+a,b)max(v+a,b)max(v+a,b),这样如果是区间加,就打上(a,−inf)(a,−inf)(a,-inf)标记,是区间减就打上(−inf,b)(−i...原创 2018-09-11 16:52:56 · 354 阅读 · 0 评论 -
今天来谈谈李超线段树
例题:bzoj1568 那么这就是在二维平面里维护直线,资磁插入一条直线和查询直线x=k与其他直线相交的点中,最大的y坐标。那么什么是李超线段树呢? 对于一个区间,我们维护该区间的所有直线中,从上往下去看可以看到它的长度最大的一条直线(即没有被其他直线覆盖的长度最大) 现在插入一条直线(称为当前直线)到了一个区间。 1.如果还没有记录直线,则将当前直线变成记录直线,返回。 2.如果当...原创 2018-07-27 11:26:45 · 3403 阅读 · 0 评论 -
洛谷P4719 【模板】动态dp 矩阵乘法+树链剖分+线段树
题目描述给定一棵 nnn 个点的树,点带点权。 有 mmm 次操作,每次操作给定 x,yx,yx,y ,表示修改点 xxx 的权值为 yyy 。 你需要在每次操作之后求出这棵树的最大权独立集的权值大小。题目分析假如没有修改操作,这题怎么做呢?设axaxa_x为xxx的点权,f(x,0/1)f(x,0/1)f(x,0/1)表示xxx这个点不选/选的情况下,其子树中的最大权独立集权值大...原创 2018-07-13 22:24:17 · 1160 阅读 · 0 评论 -
codeforces 997E 线段树
我除了WXH天下第一还能说什么呢…… 所谓好区间,就是(max−min)−(r−l)=0(max−min)−(r−l)=0(max-min)-(r-l)=0的区间。 我们将所有询问离线,按照右端点从小到大排序。然后从左到右处理每一个右端点,每次处理时,线段树里维护一下对于每个左端点(这个只需要用单调栈来处理最小值和最大值的更新即可),(max−min)−(r−l)(max−min)−(r−l)...原创 2018-07-06 13:49:53 · 951 阅读 · 0 评论 -
codeforces 700E 后缀自动机+线段树合并
每次只算s[i-1]是s[i]的后缀的情况,显然是不会影响答案的。因为如果s[i-1]不是s[i]的后缀,那么我们把不与s[i-1]匹配的那后面一截都去掉,s[i]就会变短。如果没变短之前它在某一个字符串里出现过了,那么变短后显然还是出现过的。于是想到后缀自动机,建立后缀自动机。既然有“出现两次”这个条件,那么显然与每个节点的right集合(或者说end-pos集合?)有关。想到一个dp:...原创 2018-07-24 10:06:28 · 604 阅读 · 0 评论 -
边分治学习笔记(bzoj2870)
如果点分治的话,那个取最小点权操作很难合并,不过树可以点分治,那自然也可以边分治。我们每次找到一条边,使得删掉这条边后的两个连通块中最大的那个的大小尽可能小,然后处理经过这条边的路径信息…… 桥豆麻袋,这个复杂度好像不太对啊。 在菊花图上,好像可以轻易变成O(n)O(n)O(n)的啊!!! 于是我们就要把树做一下转化,如果一个点有太多个儿子,我们就建立若干个虚拟点来管理它的儿子们,这样这棵树...原创 2018-06-29 10:49:22 · 3759 阅读 · 0 评论 -
bzoj4825/洛谷P3721 单旋 splay
题目分析有人问起我学会的第一个高级数据结构是什么。我说是spaly。在HNOI2017的考场上学会的。俗话说的好,双旋的splay,单旋的spaly,不旋的saply,O(1)的asply,那么我们就来用splay做一做这道题。首先我们手模一发单旋最小值操作。会发现,假如最小值节点是x,那么这个操作就是把x放到根,x的右子树给他原来的父亲当左子树,把原来的根节点给它做右子树。...原创 2018-03-15 21:59:48 · 349 阅读 · 0 评论 -
bzoj2594/洛谷P4172 水管局长 kruskal+lct
题目分析由于只有删边操作……众所周知,删边操作不如加边操作好处理,那么我们将时光倒流一下,逆着处理询问,这样删边操作都变成了加边操作…… 然后很显然,要最小化两个点之间路径上的边权最大值,就可以弄出最小生成树然后搞。 所以加边的同时维护最小生成树……那就是lct了…… 然后对于一条边,新建一个点,点权即该边边权。而原图上的点的权值为0。splay维护子树中最大权值点的编号。 那么对于一...原创 2018-03-08 20:16:29 · 361 阅读 · 0 评论 -
bzoj2616 SPOJ PERIODNI 笛卡尔树+DP
题目分析建立出小根堆性质的笛卡尔树,于是每个节点可以代表一个矩形,其宽度为子树大小,高度为该节点记录的那一列高度-父节点那一列高度。设f(x,i)f(x,i)f(x,i)表示以xxx为跟的子树中放了iii个棋子的方案数。初始值:f(0,0)=1f(0,0)=1f(0,0)=1首先求出不在xxx的矩形中放棋子的方案数:f(x,i)=∑j=0if(ls(x),j)f(rs(x),i−j)f(x...原创 2019-05-13 15:54:53 · 301 阅读 · 1 评论 -
loj3059/bzoj5494/洛谷P5294 [HNOI2019]序列 单调栈+主席树
题目分析若a单调不升,如图,b全部相等显然比b不相等要优。那么∑i=1m(ai−b)2\sum_{i=1}^m (a_i-b)^2∑i=1m(ai−b)2,求导得∑ai2−2b(∑ai)+mb2\sum a_i^2-2b(\sum a_i)+mb^2∑ai2−2b(∑ai)+mb2,当导函数等于0时取到最小值,此时b=∑aimb=\frac{\sum a_i}{m}b=m∑ai也...原创 2019-05-04 15:38:16 · 368 阅读 · 0 评论 -
codeforces1063F String Journey SAM+DP+dfs序+线段树
题目分析实际上,分出来的所有ttt的长度应该是连续的,因为如果不连续的话,删掉过长的ttt首尾几个字符即可。于是可知,ti+1t_{i+1}ti+1应该是tit_iti删掉首字母或者尾字母形成的字符串。将原串反过来,前缀就变成了后缀。设dp(i)dp(i)dp(i)表示以字符iii结尾划分为最后一个字符串,可以划分的最大长度。由于以iii结尾的字符串和以i−1i-1i−1结尾的字符串,...原创 2019-03-15 08:07:53 · 384 阅读 · 0 评论 -
长链剖分学习笔记
什么是长链剖分?轻重链剖分就是选择子树最大的儿子与当前点在同一条重链里,而长链剖分就是选择向下能达到的深度最深的儿子(也就是到叶子的链长度最长的儿子)与其在同一条长链中。从任何一个点往上跳到根,最多经过n\sqrt{n}n条不同的长链。根据长链的性质,这条长链链顶的父亲所在的长链,一定不会比它短,然后如图,最坏情况每条长链长度n\sqrt{n}n,一共n\sqrt{n}n条。应用...原创 2019-02-27 10:05:31 · 2774 阅读 · 0 评论 -
spoj树上查询系列题:QTREE
QTREE树有边权 CHANGE:将第x条边的边权改为y QUERY:询问两点之间路径上的最大边权。 为了练习树链剖分,就用树链剖分做了。还是不难的,链剖后就是线段树单点修改和区间查询最大值了。注意一点,我将每个边权赋给了这条边连接的两点中深度较大的那个,所以线段树操作的时候要注意不要操作lca(代码注释部分)#include<iostream>#include&a原创 2019-01-22 19:08:04 · 345 阅读 · 0 评论 -
loj 6189 Philosopher 线段树合并+线段树分裂+Splay
这是一个悲伤的故事别人在博弈论,我在哲学家;别人在学数学,我在哲学家;别人在吉司机,我在哲学家;别人在剩余系,我在哲学家;别人在改考试题,我TM还在哲学家;首先,乘积的十进制最高位,可以就把每个数都取log,这样乘就变成了加,就不会大到爆炸。然后提取了和之后,去掉整数部分,pow一下就能得到十进制最高位了。原序列看做若干权值线段树,一棵权值线段树里维护的元素是有序的,至于是升序...原创 2019-01-15 17:32:21 · 700 阅读 · 1 评论 -
洛谷P4585/bzoj4137 火星商店问题 线段树+可持久化trie树
题目分析首先特殊商品显然可持久化trie树一波就行了。至于非特殊商品呢?时间线段树套可持久化trie?注意到本题没有要求强制在线,所以并不需要套呗。把询问都落到时间线段树的区间上(用vector存),然后将所有添加商品事件都按照商店编号排序。递归遍历时间线段树,遍历到一个区间(线段树的一个节点)时,将这个区间的所有添加商品事件建立可持久化trie树。然后处理这个节点上的所有询问。代码...原创 2018-12-14 08:26:24 · 559 阅读 · 0 评论 -
bzoj3958 Mummy Madness 二分答案+扫描线
题目分析在T时刻,每一个木乃伊可能处于的位置,和你可能处于的位置,都是个正方形。如果木乃伊们的正方形将你的正方形完全覆盖,你无处落脚,必定死亡。而T+1时刻,因为T时刻木乃伊可能在的每个格子的周围8个格子,此时都可能有木乃伊了,所以,不可能在T时刻没有你可以待的地方,T+1时刻就有了。因此,你有无可落脚的格子这个状态是单调的,可以二分。二分答案,求出所有木乃伊的矩形和你的矩形的并,然后扫描线...原创 2018-12-07 20:09:36 · 335 阅读 · 0 评论 -
bzoj1492 货币兑换cash dp斜率优化+splay/cdq分治
斜率优化首先,由于如果在i天买在j天卖有利可图,那么最优方法就是在i天花完钱在j天卖完。我们令fif_i为第i天可以得到的最多钱数,然后可以先列方程求出花完钱在第j天得到的两种金券数xj=fjRjajRj+bjx_j=\frac{f_jR_j}{a_jR_j+b_j}和yj=fjajRj+bjy_j=\frac{f_j}{a_jR_j+b_j},然后得到状态转移方程:fi=xjai+yjbif原创 2018-01-03 20:29:32 · 808 阅读 · 0 评论 -
洛谷P3960/loj2319 列队 Splay或线段树
让我们想想每次出队操作要做什么?本质上来看就是两种操作,寻找第k个人和把他放到末尾。 可以,这很Splay 又发现大多数人不会被挪动,所以我们可以把编号连续的人缩成一个点,如果我们要动其中的一个人,就把这个点拆成三个继续操作。 那么我们建立n+1棵Splay,其中n棵是处理每行的第1个人到第m-1个人建立,最后一棵是处理最后一列。 然后每次操作就是: 1.在第x行找到第y个人,拆点,删掉...原创 2018-06-12 11:57:14 · 345 阅读 · 0 评论 -
loj2495/bzoj5286/洛谷P4425 转盘 线段树
可以发现,如果我需要在转盘上走两圈,不如在第一个物品上停留一段时间,然后再走一圈。 假设我们固定起点,那么一定是走一圈+多出来的一点点。 会发现那多出来的一点点假设走到x,那么以x+1为起点就可以只走一圈。 所以得到结论:最优方案一定是在第一个物品上停留一段时间后走一圈。拆环,把原数列往后面粘一遍,设ai=Ti−iai=Ti−ia_i=T_i-i(即走到这里时可以标记该物品需要预先停留的...原创 2018-05-04 21:22:31 · 599 阅读 · 0 评论 -
SPOJ 1557 GSS2 线段树
题目大意这道题我们以前考过啊,那时的题面是这样的: Xzy参加大胃王比赛,一排n个食物摆在他面前,不同种类的食物有不同的美味程度。xzy会在[l,r]区间里选择一段一口咬下去,由于xzy是一个喜新厌旧的男人,所以如果他吃到多个相同食物,只算一次美味程度。求他在不同的[l,r]里可以得到的最大美味程度。题目分析好难啊QAQ,不会 离线,把所有的询问按照r从小到大排序。然后开始枚举每一个食物。 假原创 2017-09-09 11:06:10 · 493 阅读 · 0 评论 -
poj2482/洛谷1502 线段树+扫描线
题目大意(洛谷上的翻译) 飞逝的的时光不会模糊我对你的记忆。难以相信,从我第一次见到你以来已有3年光阴。我仍然还真切地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀着你玫瑰色的脸颊。我明白,我已经沉醉于你了。之后,经过几个月的观察和窥探,你的优雅与智慧,你对待生活的态度和你对未来的愿望深切地在我心中留下了印象。你是迷人的阳光女孩,我总是梦想着与你分享余生。唉原创 2017-09-25 21:38:56 · 697 阅读 · 1 评论 -
bzoj1095 线段树括号序列
题目分析首先%%% 岛姐的讲解 然后%%% hzwer的代码 最后%%% 树王的帮助 好吧,写写我的感悟。括号序列与距离首先我们对于一棵美丽的树,可以生成一个先序遍历的括号序列,左括号表示到达该店,右括号表示离开该点。例如下图这棵美丽的树,可以生成一个这样的序列:(1(2(3)(5))(4)(6(7))) 这个序列有什么用呢?两个点之间的距离,就是它们之间括号序列去掉可以匹配的括号后的括原创 2017-09-14 21:55:41 · 717 阅读 · 0 评论 -
线段树与动态规划(例题:poj2374,HDU3016)
poj2374题目大意每一行有一个栅栏,在(n,s)位置有一群牛要到(0,0)位置去,他们无法翻越栅栏,遇到栅栏只能从两侧绕开,求他们横向移动的最短距离题目分析朴素dp:考虑用f[i][0]和f[i][1]分别表示到达i栅栏的左边和右边的时候的最短距离,暴力查找上一个栅栏即可。 线段树优化:由一点点贪心的思想可知,绕路的时候,从一个栅栏的两侧往前走,在没有走到另一个栅栏面前时,可以不横向移动。所以原创 2017-09-10 16:26:25 · 516 阅读 · 0 评论 -
HDU4126 最小生成树+树形dp
题目大意战争时期有一座城市,给出地图,我们希望选出一些路来安置守卫,使得这些路可以连通所有城市,但是每条路安置守卫的费用是不同的。 可是由于形式多变,有些路上安置守卫的费用可能增加。我列了一张清单,共q种情况,每一种情况表示i城市到j城市之间道路上安放守卫的费用可能增加到w。我希望算出所有情况安置守卫的最小费用的平均值。题目分析首先用prim算法求出最小生成树并建树。 如果某种情况下要改变的边不原创 2017-08-23 10:18:09 · 356 阅读 · 0 评论 -
线段树入门--by konnyakuxzy
转自k-xzy.cf,作者konnyakuxzy1.写在前面对线段树这个东西窝也是刚刚才算搞明白,对于很多东西还不是很清楚,只讲一些很简单的东西分享一下,也是等于做一个记录,这样到时候我自己忘掉了也还能看看这个博客想起来……代码全部是C++的,总之一句话:错了别怪我~┭┮﹏┭┮2.线段树是什么 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一转载 2017-05-18 19:11:30 · 518 阅读 · 0 评论 -
poj2528Mayor's posters
题目分析大水题 既然这么水我就不写分析了。 好吧还是写,就是离散化,为了方便,我用了map,事实上也并没有卡不过时限,不过慢一些了是真的。 拿样例来说吧。 1 4 2 6 8 10 3 4 7 10 我们排序得到(其实不排序也行,map的遍历是按照顺序遍历的): 1 2 3 4 6 7 8 10 然后我们就这样离散: 1->1 2->2 3->3 4->4 6->5原创 2017-05-04 21:56:56 · 1275 阅读 · 2 评论 -
多标记线段树处理法(洛谷3373,codevs4927)
1.洛谷P3373线段树2加法和乘法标记,处理方法:加法时直接添加标记,乘法时将加法标记也进行修改,在标记下放时,先放乘法(直接乘),再放加法(直接加),放乘法标记时要同时修改加法标记。#include#include#include#include#include#include#include#includeusing namespace std;#define原创 2017-04-28 12:38:39 · 966 阅读 · 0 评论 -
cqoi2015任务查询系统(bzoj3932洛谷P2015)
题目分析看到“前k小”,有没有想到主席树?我们可以对每个时间点为根来建立主席树,然后可以差分。就是每个任务开始的时间+pos(优先级),每个任务结束的时间-pos,最后求存在k个元素的时候的前缀和。提醒这是我写的第二个主席树的题目,所以我真是弱爆了......因为没想到差分,这题只打了暴力......我可以退役了......一定注意,求前缀和的时候,左半边子树的前缀要加起来!!原创 2017-04-04 19:22:04 · 286 阅读 · 0 评论 -
对朱刘算法求最小树形图的理解(uva11865)
题目大意一个图,0号节点是源点,每一条单向边有一个价值v和一个费用w,你只有C元钱,要使得源点和所有点都连通,且价值最小的边的价值最大。题目分析二分最小价值,只有比最小价值大的价值的边才能够加进去+最小树形图 最小树形图是什么呢?除了根节点以外,每一个点都有一个入度,且根节点可以到达所有节点的神奇图叫做树形图,而最小树形图,当然就是边权和最小咯!。朱刘算法步骤1操作内容:贪心,给除了根节点以外的每原创 2017-09-29 21:57:34 · 338 阅读 · 0 评论 -
bzoj4719/洛谷1600 noip2016天天爱跑步
题外话呃,话说当年我好像连暴力25分都没拿满哈?学OI几个月的萌新直接上刑场考场也是没有办法的事情。 现在我改了noip2016的所有题目,祝愿我noip2017rp++,不要再被大佬们往死里踩了。题目分析对于每一条路径(s,t),我们令o=lca(s,t),则路径可以拆成s->o和o->t,最后处理o被重复算的那一次。dep表示某个节点在树上的深度,w表示某个节点上观察员出现的时间。 对于s-原创 2017-10-08 21:17:34 · 352 阅读 · 0 评论 -
bzoj3531/洛谷P3313 旅行 树剖+动态开点线段树
题目分析【提示】您已获得新技能:动态开点线段树 这道题,如果没有只能留宿于信仰相同的城市这个规定,显然是用树剖瞎搞一通,再用线段树瞎搞一通。 现在有了宗教信仰的规定,很容易想到的一个思路是对于每个宗教开一棵线段树。但是这样空间会GG,所以又想到动态开点线段树。 所谓动态开点线段树,就是你的编号不能和普通线段树一样,x的儿子是x∗2x∗2x*2和x∗2+1x∗2+1x*2+1,而应该新编号...原创 2018-03-08 17:10:46 · 333 阅读 · 0 评论 -
bzoj3196/洛谷P3380 线段树套splay 【附赠数据生成器】
假标题:震惊!一只蒟蒻两天刷新两次最长代码记录,这究竟是数据结构的扭曲还是代码能力的沦丧?题目分析线段树,套splay嘛。如题所言,我们就弄一棵线段树,然后线段树的每一个节点都是一棵splay,这样就方便完成各种操作。 那么这道题(应该)唯一要讲解的就是第二个操作啦,第二个操作就是二分答案+第一个操作。其他的让代码来解答吧。代码#includeusing namespace原创 2018-01-06 10:03:11 · 467 阅读 · 0 评论 -
bzoj2653 主席树 【附赠数据生成器】
题目分析要想要中位数尽可能大,就要让大的数尽量多,小的数尽量少。 而这个大小是相对于中位数而言的,所以我们可以用二分的方法先确定这个中位数x。然后,将所有大于等于x的数视作1,将所有小于x的数视作-1,这样,假若我们在满足条件的情况下可以找到一个区间和大于等于0的区间,说明可以增大x的值。否则,只能减小x的值。 那么,怎么确定区间呢?可以考虑对于原序列的每一个x都整一个1或-1的序列出来,原创 2018-01-05 20:15:08 · 312 阅读 · 0 评论 -
splay的各种操作与简易讲解
基本操作插入和二叉查找树一样,但是插入完成后要splay一下(即伸展),伸展操作下面有void ins(ll x,int fa,int &i){//&i:加上了之后其最后一个亲戚就会和他发生关系了! if(!i){i=++tot;e[i].w=x;e[i].f=fa;splay(i);return;} if(x<e[i].w)ins(x,i,e[i].s[0]);//重复的元素存不存原创 2017-07-07 11:19:42 · 1771 阅读 · 0 评论 -
旋转还是无旋?treap从入门到想死
旋转treap优点:代码比splay好打 缺点:很多操作(尤其是区间操作)不资磁插入插入方式和二叉查找树一致,新建节点后,要给节点rand一个pos值。 然后返回改节点的父亲,如果该节点pos值比父亲大,就要旋转,以保证父节点的pos值小于儿子的,满足堆的性质。使用随机数可以使得这棵树尽量平衡。void ins(int &x,LL bh) { if(!x) {x=++sss,pos[x]原创 2017-12-29 18:59:51 · 2033 阅读 · 0 评论 -
bzoj1500/洛谷P2042 维护数列 splay与无旋treap两种解法
题目分析终于完成了!这个splay板子非常牛逼…本蒟蒻在做的时候犯了很多错误,调了三天。 数据结构题,当然要面向代码,现在将比较难懂的函数梳理一下。如果您只想看完整代码,请跳到最下面。要维护的东西a:原来的序列 b:插入操作中的序列 v:节点的值 siz:以该节点为根的子树大小 son:该节点的左右儿子 f:该节点的父亲 st:存放可以使用的数组下标的一个栈(即将删去了的节点原来的标记原创 2017-12-14 16:27:08 · 587 阅读 · 1 评论