【数据结构Trick集合】
-
可持久化并查集可以看做维护fa和siz两个可持久化数组,用主席树实现即可,复杂度两个log。支持离线时,可用一个树表示出各个版本的继承关系,然后dfs,并用fa,siz两个数组描述当前版本的情况,复杂度只有并查集的一个log,且更为好写。
-
对于求中位数的题目可以考虑二分,将>=mid的赋为1,<mid的赋为-1,求区间和是否>=0.P2839 [国家集训队]middle
-
区间kth问题如果用树套树做,可以用外层树是值域线段树,内部是动态开点区间线段树,那么区间kth可以直接在外层线段树上二分,从而减少一个logK大数查询
-
主席树的build和insert函数记得return p。
-
主席树在查询时传的参数注意是rt[],不要忘了
-
cdq分治注意事项
-
cdq分治要注意一定要保证右区间不会对左区间造成贡献
-
主席树可以在树上做静态区间第k小,查询时,同时在x,y,lca(x,y),fa(lca(x,y)四颗权值线段树上同步遍历即可。[SDOI2013]森林
-
Splay的splay操作不仅可以保持复杂度,同时还起到更新信息的作用,在splay前需保证当前节点的信息正确才可以splay。
-
若需要维护的区间操作很难支持,可以考虑是否可以暴力修改,证明复杂度正确性(如区间取模和区间开平方)例题
-
线段树在某些情况下可以支持区间取模(每个数分别取模,模数不固定)和区间开方,具体操作时,用一个标记表示是否需要修改(对于取模,看max是否>=mod;对于开方,看是否全为1),若需要修改,则暴力跑到叶子节点进行修改。正确性:一个数每次取模至少减半,每次开方减的更多(实际上开5次平方下取整就变为1),因此均摊下来对复杂度几乎没有影响。但是应用时有前提:不能进行区间加一类的操作,否则就破坏了复杂度的正确性。区间取模
-
树状数组O(N)建树(虽说没什么用):前置知识:树状数组t[i]表示区间(i-lowbit(i),i]之间的信息。则可以直接用前缀和维护建树
-
二维st表(支持查询一个矩形中的最值,O()预处理,O(1)查询):设st[i][j][k1][k2]表示以(i,j)为左上角,长为,宽为的矩形中的最大值,则预处理和查询都是由4个矩形构成。若查询矩形均为正方形,还可减去一维,即st[i][j][k],其他与前者类似。
-
权值线段树和权值树状数组支持P3369 【模板】普通平衡树的所有操作,即支持插入,删除元素,查x的排名(前缀和),查排名为x的数(递归查找),查前驱(先查排名为k,再查排名为k-1的数),查后继(求[1,x]的区间和再加1即为后继的排名),树状数组做法见Here
-
动态维护一个集合的第k大元素,可以用对顶堆来做,支持插入元素,删除第k大,k+1/-1。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】