![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 66
wind__whisper
qwq
展开
-
P4775 [NOI2018] 情报中心(线段树合并)
线段树合并原创 2022-07-29 00:42:30 · 276 阅读 · 1 评论 -
P6774 [NOI2020] 时代的眼泪(分块)
分块原创 2022-07-01 18:44:08 · 379 阅读 · 0 评论 -
模板:珂朵莉树
暴力数据结构原创 2022-06-15 07:50:52 · 185 阅读 · 0 评论 -
P5321 [BJOI2019]送别(LCT)
LCT原创 2022-06-08 09:17:58 · 149 阅读 · 0 评论 -
P3293 [SCOI2016]美味
主席树原创 2022-06-01 15:40:51 · 104 阅读 · 0 评论 -
模板:pb_ds指南
科技改变生活原创 2022-05-31 16:26:07 · 619 阅读 · 0 评论 -
P3710 方方方的数据结构(kd-tree)
kdTree应用原创 2022-05-27 17:28:35 · 134 阅读 · 0 评论 -
CF1192B Dynamic Diameter(LCT)
LCT维护直径原创 2022-04-06 23:00:19 · 282 阅读 · 0 评论 -
YBTOJ:工作评估(分块)
分块原创 2022-02-24 12:30:12 · 466 阅读 · 0 评论 -
模板:Link Cut Tree(LCT)
动态树是一种支持森林删边、加边、换根的强大数据结构原创 2021-12-07 22:33:24 · 441 阅读 · 0 评论 -
P3642 [APIO2016]烟火表演(左偏树、函数)
解析感觉是左偏树的神题了.首先有一个比较显然的结论,一个合法的方案中,两个叶子到它们 lca\text{lca}lca 的距离必须相等.考虑设计 dp\text{dp}dp :fi,xf_{i,x}fi,x 表示 iii 的子树中,所有叶子到它的距离为 xxx 的最小代价.考虑这个函数如何向父亲合并.设一个结点到父亲的距离为 cic_ici .朴素 dp\text{dp}dp ,就有:fi,x=∑j∈soniminv≥0xfj,x−v+∣cj−v∣f_{i,x}=\sum_{j\in原创 2021-11-15 10:41:42 · 172 阅读 · 0 评论 -
CF1404C:Fixed Point Removal(离线)(树状数组二分)
解析写了不少线段树上二分,原来树状数组上也是可以二分的首先如果ai>ia_i>iai>i,那必然无法删除,下面只考虑ai<=ia_i<=iai<=i的情况本题试图离线不难想到,但我一开始总是按照刻板思维尝试按序移动左端点,结果根本没法做…反过来想,移动右端点就可做多了设fif_ifi表示当前右端点为r的情况下,[i,r]最多可以删掉的数量那么我们当把r移动到r+1时,只有fi>=i−aif_i>=i-a_ifi>=i−ai时才会对f原创 2021-11-11 20:35:12 · 143 阅读 · 0 评论 -
P5787 二分图 /【模板】线段树分治(线段树分治、并查集)
关于什么是合理的实现解析本题把并查集写在了题面上然而,我却一直沉浸在一个及其通用的判断二分图的方法中:一个图是二分图的充要条件是它没有奇环怎么维护这个玩意?带权并查集!怎么套线段树分治?可持久化!就这样,口胡完一个写起来几乎不可写的《正解》后,我却没有勇气把它实现…因为可持久化的带权并查集再套个线段树…这玩意一听就没200行写不来啊…而且最关键的是,本大聪明又动了动装着一片大海的脑瓜,发现这个东西似乎是3log了…然后…就恬不知耻的点进了题解然后…看完题解…就无地自容的点了出来.原创 2021-11-08 23:46:31 · 156 阅读 · 0 评论 -
洛谷P4971:断罪者(左偏树)
解析看起来就是左偏树的基本操作啊…然而就是调不过去吐了qwq参考了望月大神的实现感觉清晰的多就定义并查集维护的是每个点所在的堆的根节点一下子少了很多恶心的套娃代码#include<bits/stdc++.h>using namespace std;#define ll long long#define il inlineconst int N=4e6+100;const double eps=1e-9;inline ll read(){ ll x=0,f=1;c原创 2021-11-03 15:47:18 · 117 阅读 · 0 评论 -
洛谷P2497:基站建设(splay、斜率优化)
所谓splay斜率优化dp,就是利用splay和斜率对dp进行优化(逃)解析在斜优的时候,有时我们会发现我们插入的点的横坐标并不单调这个时候我们就无法利用单调队列维护凸包了这时,我们就要请出今天的主角:splay插点splay斜优最容易错的一个地方我们维护一个以结点横坐标作为关键值的splay结点记录第信息有:左右儿子、父亲、xy坐标、分别与左右两边第一个结点的斜率注意这个第一个结点不一定是左右儿子!特别的,没有儿子时赋值成正(右)负(左)无穷step1首先,让我们把结点按照s.原创 2021-10-29 01:26:19 · 279 阅读 · 0 评论 -
模板:二维线段树(线段树套线段树)
问题给出一个矩形要求支持以下操作:1.询问一个子矩形的最值2.修改某一个单点的值解析使用线段树套线段树,来解决二维动态问题注意这个东西只能支持单点修改,区间查询区间改直接死翘翘对于x轴开一个线段树每个结点对应一个y方向[1,n]的长条时空复杂度qlogn2qlogn^2qlogn2单点修改由于这个矩形可能很大(比如长宽1e5级别)我们可能无法把整棵线段树存下来所以使用x方向直接开,y方向动态开点为什么x方向不动态开点?因为那实在是太不好写了…那如果长宽1e9级别怎么办?原创 2021-10-25 01:01:35 · 987 阅读 · 1 评论 -
动态区间第k小:树状数组套权值线段树
解析如何解决静态区间第k小?使用主席树就ok啦辣么如何解决动态区间第k小嘞…我们想想主席树为啥不能解决动态区间第k小因为如果改了一个点的值,后面所以的权值线段树都需要修改单次修改的时空复杂度为nlognnlognnlogn,无法承受仔细想想,静态的主席树似乎就是一个关于值域的高级一点的前缀和暴力修改前缀和当然是需要修改O(n)O(n)O(n)个了但是既然是前缀和,我们为就可以想到用树状数组优化这样需要修改的东西就变成了O(logn)O(logn)O(logn)个了具体的说,和树状数组的原创 2021-10-23 22:57:57 · 263 阅读 · 0 评论 -
CSP2019&洛谷P5666:树的重心
解析毒题细节有亿点点多我一开始的思路是没有问题的尝试统计有多少种方案能砍出大小在一个区间的子树、当时的想法是线段树合并但是这个玩意在需要保留原树的情况下空间复杂度炸没了…因为我垃圾的实现一个dfs里面就玩了七遍merge函数…空间常数飞起然后分数就和暴力一毛一样qwq考虑一些更灵巧的做法动态维护一个关于值域的树状数组要求一个子树内的答案用遍历到子树根前后的结果相减子树外就是最终的结果减去子树内结果然后我这个垃圾的实现似乎还需要再开一个树状数组动态维护返祖链的答案…虽然实现还是原创 2021-10-16 20:39:25 · 294 阅读 · 0 评论 -
模板:无旋treap
文章目录前言操作合并所谓无旋treap,就是不带旋转的treap前言现在“理论上”我会四种平衡树了之前说无旋treap功能弱,是我狗眼看银低了qwq这玩意区间上该搞的也能搞而且确实是非常的 好写!!有点想把这个作为默认项了呜呜呜朝三暮四肿么办呐操作关键是合并和分裂合并考虑合并u和v两棵子树...原创 2021-10-07 17:39:22 · 91 阅读 · 0 评论 -
模版:替罪羊树
文章目录前言注意事项代码所谓替罪羊树,就是有一头替罪羊的树(逃)前言在看完了一大堆各种平衡树的教程之后,决定学一个这个因为它有一个很关键的好处:无须旋转可以在pushup复杂度太恶心的题中做到splay做不到的事情比如平衡树套线段树但是在区间问题中还是splay最强啦!注意事项拍扁操作必须是未被删除的点拍扁时要记录点的副本数量!代码#include<bits/stdc++.h>using namespace std;#define ll long long原创 2021-10-04 08:00:50 · 96 阅读 · 0 评论 -
YBTOJ:染颜色(KDtree)
文章目录题目描述数据范围解析代码题目描述数据范围n≤105,T≤5n\le10^5,T\le5n≤105,T≤5解析关键是对问题的转化考虑一次修改,一个点需要满足哪些条件才可以满足1.与x的距离不超过lll2.在x的子树内这两个条件可以转化为对深度的限制和对dfs序的限制这样本题就变成一个二维平面区间修改单点查询的问题问题得以解决代码#include<bits/stdc++.h>using namespace std;const int N=5e5+100;原创 2021-09-29 15:12:14 · 117 阅读 · 0 评论 -
模板:K-D tree
文章目录前言思想操作建树询问修改完整代码所谓KDtree,就是有K个D的树(逃)前言KDtree是一种解决多维问题的暴力数据结构K维状态下的最差复杂度是nk−1/kn^{k-1/k}nk−1/k在最常见的2Dtree中就是根号n但是玄学的它常常能到logn的复杂度是骗分利器 (据说)思想按照每一维交错排序不断用超平面尽量的平分所有点操作建树就是按照思想所说的模拟即可使用O(n)的nth_element十分方便int build(int l,int r,int f){ i原创 2021-09-29 00:30:48 · 194 阅读 · 0 评论 -
YBTOJ&洛谷P4331:数字序列(左偏树)
文章目录题目描述数据范围解析代码题目描述数据范围n<=1e6n<=1e6n<=1e6解析先考虑简单情况如果原数列是单调递增的,显然应该使bi=aib_i=a_ibi=ai如果单调递减,应该取中位数那么原数列如果分成单调递减的几段,那么每一段都取中位数使最好的但是这样会有非法的情况,因为中位数不一定单调递增所以我们把中位数递减的区间合并,再求大区间的中位数即可那么怎么快速维护合并区间中位数呢?主席树最棒了考虑对每个区间建一个堆,pop掉一半的元素,这样堆顶就是原创 2021-09-28 19:28:06 · 87 阅读 · 0 评论 -
模板:左偏树
文章目录解析定义:左偏树的基本性质基本结论操作合并访问与删除堆顶元素插入元素批量插入删除已知元素所谓左偏树,就是往左偏的树下面介绍一下它的一个兄弟:《右偏树》(逃)解析所谓左偏树,确实就是往左偏的树它舍弃了平衡的性质,使这个堆在合并时变得极为高效所以又叫做可并堆定义:外结点 :左儿子或右儿子是空结点的结点。距离 : 一个结点 x 的距离 dist(x)定义为其子树中与结点 x 最近的外结点到 x 的距离。特别地,定义空结点的距离为 -1 。左偏树的基本性质左偏树具有堆性原创 2021-09-27 09:31:08 · 445 阅读 · 0 评论 -
YBTOJ&洛谷P2042:维护数列(平衡树)
文章目录题目描述解析删除区间插入数列修改&翻转区间和&最大子段和代码传送门题目描述解析阴间题…这不是裸的板子吗?国赛真的有人能把这题写出来吗…应该算一道练习作用很强的题了写完这题,各种平衡树维护区间操作的方法可以说是毕业了吧题解封装一个split函数的实现技巧值得借鉴总的来说就一句:不要忘记pushdown和pushup!删除区间设删除区间为[l,r]先把l-1结点splay到根再把r+1转到l-1的下面这样[l,r]一定就在r+1的右儿子了直接删掉即可插原创 2021-09-24 23:43:10 · 187 阅读 · 0 评论 -
主席树 学习报告
文章目录前言可持久化线段树代码区间第k大代码练习粟粟的书架代码森林代码任务查询系统代码列队代码前言主席树,全称是可持久化权值线段树利用r和l-1两棵权值线段树作差得到[l,r]的信息从而解决各种问题在排名这方面功能极其强大可持久化线段树学主席树之前,我们当然要先掌握这个东西啦首先有一个动态开点其实也很简单,就是只增加每个版本信息相对于上一个版本不同的结点,其他结点保留这样每次修改只会增加log个结点保证空间复杂度的正确性代码#include<bits/stdc++.h>原创 2021-08-25 00:25:29 · 259 阅读 · 0 评论 -
模板:笛卡尔树
介绍笛卡尔树是一种非常特殊的二叉搜索树。每个节点有两个信息x和y。如果只考虑 x,它是一棵二叉搜索树,如果只考虑 y,它是一个小根堆。实现按照y升序插入显然应该插入到一条极右链上但为了维护x二叉搜索树的性质对于右链上x>当前元素的点应该接到当前元素的左儿子上从而保证两个性质均符合实现可以用单调栈线性解决代码#include<bits/stdc++.h>using namespace std;#define ll long long#define ull unsig原创 2021-08-24 23:57:08 · 117 阅读 · 0 评论 -
平衡树练习总结
文章目录前言普通平衡树文艺平衡树郁闷的出纳员书架宠物收养场机械排序千山鸟飞绝总结前言专门刷了一天半的平衡树 (附带划水OvO)使用的是蜜汁常数的splay感觉对平衡树的理解还是有帮助的一些较为常规的平衡树的题应该是差不多了更正之前刚学的观点!平衡树当然在维护排名上很有优势但它最强大的功能应该是区间问题还有一些对于整个集合改变的乱七八糟的神奇标记(见:千山鸟飞绝)一道道说一说吧普通平衡树传送门怎么能不水一发模板呢(连打了三天后终于能二十分钟打完一次A了qwq)当然还有一个强化版模原创 2021-08-22 13:14:00 · 195 阅读 · 0 评论 -
模板:二叉搜索树&平衡树
二叉搜索树二叉搜索树是一种二叉树的树形数据结构,其定义如下:空树是二叉搜索树。若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。二叉搜索树的左右子树均为二叉搜索树。二叉搜索树上的基本操作所花费的时间与这棵树的高度成正比。对于一个有 n个结点的二叉搜索树中,这些操作的最优时间复杂度为 Ologn,最坏为On。随机构造这样一棵二叉搜索树的期望高度为logn。代码#includ原创 2021-08-19 17:32:17 · 401 阅读 · 2 评论 -
猜数(二分、线段树)
题目描述对于一个长度为n的数列给出m个描述每一个描述给出一个区间[a,b]的最小值的x求从第几个描述开始矛盾解析本题关键是一个关于矛盾的充要条件:如果存在一个最小值x,其所在的区间的交集(就是它真正可以存在的区间)是比x大的所有最小值的区间的并集的子集,那么就会矛盾(因为x肯定在那些区间中的一个里,那么那个区间的最小值就应该是x了)知道这个之后后面就好做了把所有区间按最小值降序排序二分出现矛盾的位置mid每次按新顺序考虑mid之前的描述用线段树维护之前所有的并集并查询交集判断是否原创 2021-06-12 16:21:01 · 103 阅读 · 0 评论 -
上帝造题的七分钟(ybtoj-树状数组)
文章目录题目描述解析代码thanks for reading!题目描述解析差点活活恶心死搬砖题(其实细节没有那么多,还是代码能力太差)利用矩阵的二维差分加上树状数组搞一搞就完事了(我实在不想再写了 )洛谷的双倍经验没有那么好水MLE!这题洛谷的空间限制非常苛刻几乎没有多余的空间以后要增强对空间复杂度的敏感性代码(看我的print就能看出我调了多久)#include<bits/stdc++.h>using namespace std;const int N原创 2021-05-30 00:29:49 · 232 阅读 · 0 评论 -
染色(树链剖分 洛谷-P2486)
文章目录题目描述解析代码thanks for reading!传送门首先,对hash学姐对本题拔刀相助的debug行为表示衷心的感谢题目描述解析用线段树维护颜色序列个数、最左颜色与最右颜色合并时如果左儿子的最右颜色等于右儿子的最左颜色,就把加和-1在加上树剖的基本操作即可几点注意事项:1.从重链头往父亲跳的时候要判断一下,如果链头与父亲同色,需要减一2.线段树区间查询合并答案也要注意两边如果颜色相同要减一!(我就因为这个调了一个多点。。。)代码#include<bit原创 2021-05-26 23:38:22 · 78 阅读 · 0 评论 -
理解至上:二叉堆与优先队列详细用法
二叉树为什么不用pq呢算比较简单的数据结构了主要性质:1.是二叉树2.爸爸比#include<bits/stdc++.h>using namespace std;#define ll long long#define mem(a,b) memset(a,b,sizeof(a))const int N=1e5+100;int a[N];int n,m;void put(int k){ tree[++len]=son; int son=len; while(son&g原创 2021-04-13 22:10:05 · 132 阅读 · 0 评论