2024.10.1 总结(集训;数据结构 主要是线段树)
XK 又来给我们讲课了。开心!
1. Baka's Trick
两种理解:
- 双栈模拟队列。
- [找到若干个划分点,使得每个区间包含恰好一个划分点。维护划分点到划分点段的前缀、后缀信息。在在线的实现中,在队列中维护仅仅一个划分点,维护它到前面每个点和它到后面每个点的信息。当这个划分点出队时,把队列中最后的点作为新的划分点。画图理解。](???)
在网上意外发现的(好像是暴力重构):https://www.cnblogs.com/xiaoziyao/p/17413029.html
2. 在线 & 离线
- 在线:比离线多了时间维。时间维 -> 对操作(包括询问)顺序的限制。
- 离线:去掉时间维。
3. 01 反转的一个 trick
用 2 棵平衡树来维护,一棵只维护是 0 的点,另一棵只维护是 1 的点。
01 反转操作相当于交换两棵平衡树上的某段区间。
4. 线段树区间二分
线段树子树二分直接做即可。但线段树区间二分有区间的限制,不好直接做,考虑转成线段树子树二分。
于是我们把这段区间在线段树上对应的 [log](?)个结点取出来。依次看答案是否在当前结点,如果不在就接着看下一个结点,如果在就直接在以这个结点为根的子树里二分(线段树子树二分)即可。
时间是单 log 的,因为找线段树子树二分的起点是 log,线段树子树二分也是 log。
实际实现不用真正把区间对应的 [log](?)个结点都抓出来,外层的找起点可以在线段树上直接找。见下面例题我的代码或我参考的那篇题解的代码。
例题:P11071 「QMSOI R1」 Distorted Fate。
5. 空间优化
- 转成只有 01[(或者类似,总之很小[/很少](很少 -> 离散化转成很小))](?),用 bool 之类的东西来存。只有 01 就可以直接用 bitset 了。(缩小值域)
- 上面一条的一个另外的东西,比如三进制的状态离散化之后可以转成二进制(好像是插头 DP 板子里[要](???)用)。(缩小定义域)
- 复用优化空间。
- 离线复用优化空间。
6. 关注点权正负 贪心
[如果点权都是正的(或者非负),想想贪心。](?????)
例题:[P10641](?)。
7. xor 有结合律,还能拆
8. 树上距离,转成 dep 的和差(dep 不一定是深度,可以把 和根之间的路径上的边权和 作为深度)。有时需要分讨 lca。
9. 有的题要考线段树的结构。一段区间在线段树上取出的结点参考非递归线段树。
10. 分治、合并
-
分治(或划分)和合并互为对方的逆(反过来的过程)。这一点可以用于转化题意、分析时间复杂度。
-
如果一次分治时的复杂度只看较小的一边,那么这个分治就是逆的启发式合并。
-
分治不一定要按区间中间那个 mid 分开,也可以按区间最值来分开。
上面两条的例题:。
11. 不好直接做的限制
“刻画”
维护一些信息,把限制转化成关于这些信息的不等式。
把不等式变成关于 i 的东西都在一边、关于 j 的东西都在另一边的样子。(这里以优化 DP 为例,可能可以从 j 转移到 i,这个转移有限制)
于是问题被转化成了二维数点问题。
扫描线(按照某一维排序),将二维数点问题转化为一维数点问题。
例题:XK 今天的抓的比赛里的 T4。
12. 抓 排列的性质
用好排列的性质。
- 数不重复。
- 调和级数。
- [下面这条(1 到 n 枚举倍数的倍数)。](???????)
- mex(这里认为是最小的没出现的 正数)转 min。(比如区间 mex,变成排列中不在这个区间里的数的 min)
例题:好像是 XK 今天的课件里 EX 部分的第一题。
13. [1 到 n 枚举倍数的倍数](???????)
[时间 \(O(n \log ^ 2 n)\)。](???????)
14. DP 中,关注状态数、转移数
如果很少可能就会有特殊处理方法。
例题:好像是 XK 今天的课件里 EX 部分的第二题。
15. 维护一些信息,用它们来判定
例题:好像是 XK 今天的课件里 [IOI] [Seats](???)那道题。
16. [蒙特卡洛判定](???????)
必要条件。[(充分条件好像也可以(还没有分析概率),只是多次做的时候不太一样(有一个可行就可行))](???????)
正确概率的分析。
做多次来提高正确概率。
例题:今天下午比赛的 T1。
lr 推的题:https://qoj.ac/problem/6504
2024.10.1