平衡树 3
动态区间问题
一般见到这些个,传统做法就Splay和无旋Treap
然后一个基本的原理就是:
平衡树的中序遍历必须和原序列一致
然后其实这个也挺简单
区间插入
这个Splay可以干:
区间左端点Splay到根
右端点Splay到右儿子
然后插到端点左儿子即可
区间翻转
首先找到对应区间
还是这个操作:
区间左端点Splay到根
右端点Splay到右儿子
左儿子就是待修区间
先打标记不着急旋转
查询
区间左端点Splay到根
右端点Splay到右儿子
左儿子就是待查区间
序列第K位
相当于一个第K大
然后就是几道例题?
JSOI 火星人
维护子串?
动态问题就是hash了
有点意思
前缀相同是满足单调性的
主要就是快速维护字符串
注意到操作一是任意位置插入
这个就是平衡树,也就是说平衡树一定要用
考虑把平衡树利用更充分
插入以后,原序列对应的平衡树上左子树哈希不变
右子树整体左移一位然后再加根
于是这样的话插入就非常好搞了
关键是查询:
前缀相同是满足单调性的,所以就可以二分答案
然后平衡树上查找就可以了
时间复杂度
所以整体时间复杂度
查询整体来书这个复杂度能过,所以就结束了
TJOI 最长上升子序列
1是区间插入
2是询问最长升子序列长度
如果是区间插入的话,原来的最长上升子序列在插入以后不受影响
于是答案就是新插入的和原来的比
注意到新插入的最长上升子序列一定以新插入的元素结尾
(因为原来的上升子序列在插入以后不受影响)
然后把这个新插入的元素Splay到根
那么以这个新插入的元素结尾的最长上升子序列长度就是左子树中最长上升子序列+1
ZJOI 书架
这个Splay操作还是比较基础的
1.置顶:find这个元素,别的元素直接当右子树
2.置底:find这个元素,别的做左子树
3.插入:有点意思,这个其实是和前驱后继交换信息
4.查找书上有几本书:旋到根,然后左子树大小就是
5.查第几本书:第k大
TJOI 甲苯先生的滚榜
大致应该是这样的:
1.find到第i个A的人
2.删除原数据
3.这个人的AC数加1,罚时数加k
4.插回去,查询排名
HNOI 永无乡
可以线段树动态开点
也可以平衡树启发式合并
注意上并查集维护每个联通块
然后就没有然后了
NOI 郁闷的出纳员
这个题主要是学打标记
如果每个点都暴力的来了这一次操作?
考虑转换影响:
每个点都可以看成是一开始加进来的点
然后经历了若干工资变动变成了实际上刚进公司的样子
然后我们就可以维护一个全局的lazy变量
然后这个lazy变量在每次操作的时候加或减就行了
然后注意lazy在变的时候如果工资加上lazy小于min的时候必须立马滚蛋立刻删点
否则影响的是查询操作
然后就是删点
直接加上一个min+lazy的点,这个点连着左子树一起删掉就可以了
但是暴力删点摊还分析一下维护每个点时间复杂度是
于是就可以暴力删点了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具