【数据结构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),若需要修改,则暴力跑到叶子节点进行修改。正确性:一个数每次取模至少减半,每次开方减的更多(实际上109开5次平方下取整就变为1),因此均摊下来对复杂度几乎没有影响。但是应用时有前提:不能进行区间加一类的操作,否则就破坏了复杂度的正确性。区间取模

  • 树状数组O(N)建树(虽说没什么用):前置知识:树状数组t[i]表示区间(i-lowbit(i),i]之间的信息。则可以直接用前缀和维护建树

  • 二维st表(支持查询一个矩形中的最值,O(N2log2N)预处理,O(1)查询):设st[i][j][k1][k2]表示以(i,j)为左上角,长为2k1,宽为2k2的矩形中的最大值,则预处理和查询都是由4个矩形构成。若查询矩形均为正方形,还可减去一维,即st[i][j][k],其他与前者类似。

  • 权值线段树和权值树状数组支持P3369 【模板】普通平衡树的所有操作,即支持插入,删除元素,查x的排名(前缀和),查排名为x的数(递归查找),查前驱(先查排名为k,再查排名为k-1的数),查后继(求[1,x]的区间和再加1即为后继的排名),树状数组做法见Here

  • 动态维护一个集合的第k大元素,可以用对顶堆来做,支持插入元素,删除第k大,k+1/-1。

posted @   glq_C  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示