随笔分类 - 数据结构
摘要:前置知识:Splay和文艺平衡树 介绍 Link Cut Tree,简称LCT, 时间复杂度分析 细节 原splay函数 Rotate()中,注意son[z][]的赋值要有限制语句isroot(y),因为z可能是“认父亲不认儿子”的splay根节点的父亲(Splay()中的限制管不到,因为Splay
阅读全文
摘要:Splay 技巧/记忆点: 1、Rotate()中,使用变量记录位置关系和下标; 2、Find()(找元素 所在位置)减少重复代码; 3、求前驱/后继时先把这个数插进去再删掉; 4、Splay()父子同侧先翻父亲,再翻儿子,否则翻两边儿子; 5、siz[]在Splay()前先Pushup()
阅读全文
摘要:7574 -- 【6.05模拟】数据结构 分块 二次离线回滚莫队 cdq分治+扫描线 题目限制太多,考虑先消去 的限制,很容易想到将点分成 和 两部分,此时上下两部分可以分开统计最大值 但是如果直接将询问扔进去又会变成 的,考虑这
阅读全文
摘要:轻重链剖分 性质 重链 重链内编号连续,可以用线段树维护一些值 路径 对于树上任意两点 ,它们的路径经过的重链不超过 条 树剖正是运用这种方式,把1个修改/询问变成 个修改/询问,然后高效求解 注意:树剖的作用是将树上问题拆成 个序列问题,并不是
阅读全文
摘要:队列 取出放入问题 给一个序列,将最小值x取出,再将f(x)放入 一般f(x)符合某些规律或性质,多开若干个序列维护即可 例1 [P2827] 蚯蚓 例2 [P6033] 合并果子 加强版 堆 例1 P1631序列合并 有两个长度都为n的序列A、B,在A和B中各选一个数相加可以得到n2个数。求这n2
阅读全文
摘要:线段树 常用于维护区间值 代码 和题解有很大差异,但是过了就好 void Pushup(int x) { s[x]=(s[x<<1]+s[x<<1|1]); } void Pushdown(int x,int l,int r) { s[x]=(s[x]+ad[x]*(r-l+1)); if(l!=r
阅读全文