![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
平衡树
C202044zxy
这个作者很懒,什么都没留下…
展开
-
[POJ 1741] Tree
一、题目点此看题题目描述给一个nnn个点的数,找出多少点对(u,v)(u,v)(u,v)(u<vu<vu<v)的距离不大于kkk二、解法可以用启发式合并,我写的是无旋treaptreaptreap,康康代码吧。#include <cstdio>#include <cstdlib>#include <iostream>using namespace std;const int M = 100005;int read(){ i原创 2020-06-01 16:31:33 · 130 阅读 · 0 评论 -
[NOI2007]货币兑换
一、题目点此看题二、解法请仔细读题,注意一下这句话:必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币;每次卖出操作卖出所有的金券,这样就很好 dpdpdp 了,设dp[i]dp[i]dp[i]为第iii天过完后我们手中最多的钱数,首先可以什么都不干,从i−1i-1i−1直接转移,或者从之前的某一天jjj转移,用jjj所有的钱买入在iii这一天卖出,设x[i]=dp[i]Rate...原创 2020-04-06 11:09:08 · 210 阅读 · 0 评论 -
[BZOJ 3600]没有人的算术
一、题目二、解法我们把这些“数”hashhashhash一下,可以用平衡树实现。假设平衡树每个节点对应一个开区间(l,r)(l,r)(l,r),其中根节点对应(0,1)(0,1)(0,1),那么xxx左儿子对应(l,mid)(l,mid)(l,mid),右儿子对应(mid,r)(mid,r)(mid,r)。然后我们定义一个映射函数f(x)=(l+r)/2f(x)=(l+r)/2f(x)=(...原创 2020-03-14 20:38:59 · 217 阅读 · 0 评论 -
带插入区间K小值
一、题目点此看题二、解法既然要动态插入,外层用平衡树,还有查询第kkk小,内层就用权值线段树。内层要维护权值线段树,外层的平衡树要固定最好,我们可以选用替罪羊树,结构较为稳定,外层重构时内层重新插入就行了,复杂度O(nlog3n)O(n\log ^3n)O(nlog3n),如果用线段树合并的话可以做到O(nlog2n)O(n\log^2 n)O(nlog2n)插入和修改都比较好做,看...原创 2020-03-14 16:57:38 · 318 阅读 · 0 评论 -
[JOI 2014 Final]裁剪线
又一次不要脸(不经允许 )地转载了 JZM \text{ JZM } JZM 巨佬的博客。https://blog.csdn.net/qq_42101694/article/details/104775768转载 2020-03-10 18:56:09 · 292 阅读 · 0 评论 -
[WC2016]鏖战表达式
一、题目点此看题二、解法如何求解这个表达式的值?一个很显然的想法就是找到优先级最小的运算符然后把整个表达式分成两半,递归求解。我们需要维护一棵表达式树,比如说treaptreaptreap,它满足下列性质:每个节点是一个数字,或者是一个操作符。中序遍历结果原本的表达式。将数字视为最大的优先级,父节点的优先级小于子节点的优先级。举个例子,(用了JZM的图,qwqqwqqwq)还...原创 2020-01-23 20:49:03 · 370 阅读 · 0 评论 -
[BZOJ 2658]小蓝的好友
一、题目二、解法正难则反,求至少包含一个黑格子就等于全部减去不包含黑格子的方案数。考虑单调栈,对于每一行,求出每一个点最长上升,不碰到黑格子的距离,得到一个数组upupup,本题的一个重要条件是数据随机,我们对upupup数组建立treaptreaptreap,其中下标作为减值,upupup作为修正值,这样建出来的数满足根节点的upupup最小,而且由于upupup随机,能够保证复杂度是l...原创 2020-01-20 20:02:47 · 186 阅读 · 0 评论 -
序列终结者
一、题目点此看题二、解法我学懂了!!!!这道题可以写无旋treap\text{treap}treap,最近学了splay\text{splay}splay,我就讲一下它的操作吧。这道题我们需要维护权值和最大值,那么我们如何查区间呢?我们先多建两个哨兵节点(一共n+2n+2n+2个点),然后我们把排名为lll的点AAA转到根去,再把排名为r+2r+2r+2的点BBB转到(这里的排名要考虑哨...原创 2020-01-08 20:06:33 · 213 阅读 · 0 评论 -
[学习笔记] Splay
为了学 link-cut-tree\text{link-cut-tree}link-cut-tree 才讲的 Splay\text{Splay}Splay,之前已经学过无旋treap\text{treap}treap了,因为本质上都是对二叉搜索树的优化,理解起来可能会更容易吧,下面就以这一道例题:普通平衡树,来讲解一下 Splay\text{Splay}Splay 的基本操作。数组定义ch[...原创 2020-01-08 17:15:43 · 144 阅读 · 0 评论 -
[国家集训队]数颜色
一、题目点此看题二、解法正解应该是带修莫队,我们这里讲一下树套树的做法。本题主要涉及的问题是去重,我们定义nxt[i]nxt[i]nxt[i]为最靠近iii位置后面颜色和iii相同的位置,统计[l,r][l,r][l,r]里面不同颜色的个数即统计∑i=lrnxt[i]>r\sum_{i=l}^{r} nxt[i]>r∑i=lrnxt[i]>r,...原创 2019-12-05 15:07:40 · 149 阅读 · 0 评论 -
[模板]二逼平衡树(树套树)
一、题目点此看题二、解法所谓树套树呢?就是把两棵不同的树套在一起,以达到意想不到的效果。对于这道题,可以线段树套平衡树,也就是每个点维护一个平衡树,下面我来分别讲解一下每种操作。查询k在区间内的排名把区间分解成线段树上的点,查询kkk在每个点上的排名-1然后累加,最后在加上1。查询区间内排名为k的值先二分一个值,然后用拿到这个值的最大排名(我没有把相同的点合并为一个点),然后找到...原创 2019-12-03 19:56:20 · 137 阅读 · 0 评论 -
[模板]可持久化文艺平衡树
一、题目点此看题二、解法原版在这里,文艺平衡树这里遇到了一个问题,可持久化怎样下传标记,考虑到多个节点可能共用儿子,我们就不能贸然下传标记,应该暴力新建儿子节点,下传给新建的节点,所以综合文艺平衡树和可持久化平衡树这题就不难写了,改一下push_down\text{push\_down}push_down,注意要开long long\text{long long}long&nbs...原创 2019-12-02 20:17:25 · 201 阅读 · 0 评论 -
Queue-jumpers
一、题目二、解法这道题nnn很大,但是询问数很小,而且只有把一个数插到队首操作,可以考虑维护两个平衡树,第一个从小到大塞区间,最前面是插入的top\text{top}top。第二个平衡树维护插入的队首,按照编号从小到大。这样我们就可以算出一个数对应的排名和排名对应的数了,时间复杂度O(nlogn)O(n\log n)O(nlogn)。#include <cstdio>in...原创 2019-12-02 14:16:09 · 261 阅读 · 0 评论 -
CF702F T-Shirts
一、题目点此看题题目描述有n种T恤,每种有价格ci和品质qi。有m个人要买T恤,第i个人有vi元,每人每次都会买一件能买得起的qi最大的T恤。一个人只能买一种T恤一件,所有人之间都是独立的。问最后每个人买了多少件T恤?如果有多个qi最大的T恤,会从价格低的开始买。数据范围1≤n,m≤2e51\leq n,m\leq 2e51≤n,m≤2e5,1≤c,q,v≤1091\leq c,q,v\...原创 2019-12-01 11:55:46 · 166 阅读 · 0 评论 -
[模板]可持久化平衡树
一、题目点此看题二、解法其实可持久化的思路很简单,就是你永远不改原版,而是在新建点上修改。所以在merge\text{merge}merge#include <cstdio>#include <cstdlib>#include <ctime>#define inf 2147483647const int MAXN = 500005;const...原创 2019-11-30 17:38:49 · 143 阅读 · 0 评论 -
维护数列
一、题目点此看题二、解法写一发treap\text{treap}treap的题解吧,我写了足足三遍,讲一下所有坑点。操作1 insert这道题不能O(nlogn)O(n\log n)O(nlogn)无脑插入,要考虑O(n)O(n)O(n)建树,我们维护一个heapheapheap递增的单调栈,每次加入一个点弹出比它heapheapheap大的,最后一个被弹出的点是他的左儿子,他是弹...原创 2019-11-30 15:10:55 · 233 阅读 · 0 评论 -
Robotic Sort
一、题目点此看题题目描述通过一系列移动,将某些物品按顺序摆好。规定只能使用如下方式排序: 先找到编号最小的物品的位置P1,将区间[1,P1]反转,再找到编号第二小的物品的位置P2,将区间[2,P2]反转……输入n和编号,求出所有的Pi,有多组数据,1≤n≤1051\leq n\leq 10^51≤n≤105tips如果有相同的编号,要考虑顺序,可以理解为离散化,越后面的越大二、解法...原创 2019-11-28 15:58:17 · 264 阅读 · 0 评论 -
[模板]文艺平衡树
一、题目点此看题二、解法最近学了无旋treap\text{treap}treap,那就用它来水一发吧。反转区间我们不考虑权值,一开始直接用merge\text{merge}merge插入,修改时直接split\text{split}split出三个区间[1,l−1],[l,r],[r+1,n][1,l-1],[l,r],[r+1,n][1,l−1],[l,r],[r+1,n],对第二个区间...原创 2019-11-27 20:49:31 · 148 阅读 · 0 评论 -
[ZJOI2006]GameZ游戏排名系统
一、题目点此看题二、解法还是存每个名字对应的键值和键值对应的名字,把键值塞进平衡树。这道题还要分清楚插入的顺序,所以我们重新定义一个权值计算方法val=read×1e6+orderval=read\times 1e6+orderval=read×1e6+order,这样就可以区分出顺序了,用mpmpmp存一下就行了。#include <cstdio>#include <...原创 2019-11-27 18:03:13 · 209 阅读 · 0 评论 -
[NOI2004]郁闷的出纳员
一、题目点此看题二、解法这道题很新的一点就是加工资和减工资,这貌似要用到区间修改。但是细细想想,操作的对象是全树,我们可以维护一个累积的修改值,新加入一个点的话要删去之前的累计的修改值,对于减工资的情况,判断有没有低于最低的限制。注意如果一个一来人就低于最低线,那么这个人不被统计在最后的删除人数中。#include <cstdio>#include <iostrea...原创 2019-11-27 17:28:13 · 163 阅读 · 0 评论 -
[ZJOI2006]书架
一、题目点此看题二、解法每个编号都赋一个权值,然后就可以放进 treap\text{treap}treap 里了。我们需要存每个编号对应的值和每一个值对应的编号。对于 top,bottom\text{top,bottom}top,bottom 操作,我们修改权值,把原权值删除,再把最大权///最小权作为新的权值。对于 insert\text{insert}insert 操作,取出前驱/...原创 2019-11-27 17:15:36 · 144 阅读 · 0 评论 -
[学习笔记] treap
一些芝士树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树。其基本操作的期望时间复杂度为O(logn)。相对于其他的平衡二叉搜索树,Treap的特点是实现简单,且能基本实现随机平衡的结构。--------百度百科学习 Treap\text{Treap}Treap 之前,我们先来了解一下二叉搜索树。二叉查找树(Binar...原创 2019-11-25 20:28:09 · 254 阅读 · 0 评论