KTT学习笔记
KTT 学习笔记
KTT 是由 EI 给出的解决区间加正数、区间最大子段和的数据结构。
大体的思路是在把普通最大子段和的信息看成和增量有关的一次函数,然后维护增量为多少时取到最大值的信息会改变,相当于是维护凸壳,但是只维护当前段和当前段的末尾位置,通过势能分析可以得到复杂度是 \(O((n+m)\log^3n)\),实际跑起来非常快,和 \(\log^2n\) 差不多。
P5693 EI 的第六分块
题意:区间加正数,区间最大子段和。
思路:模版题,可以用来练手。
P5073 [Ynoi2015] 世上最幸福的女孩
题意:全局加,区间最大子段和。
思路:离线下来,把每次询问时累计加了多少求出来,从小到大排序,这样就转成了全局加正数,区间最大子段和。
P6792 [SNOI2020] 区间和
题意:区间对一个数取 \(max\),区间最大子段和。
思路:吉司机线段树+KTT。
因为有区间取 \(max\) 操作,只有吉司机线段树可以维护,而我们每次会影响最大子段和的情况就是对最小值进行区间修改,发现这刚好是 KTT 可以维护的东西,其余的情况都不会影响最大子段和。
复杂度应该是和 KTT 一致,就是说两种势能可以分开考虑。
The Awesomest Vertex
题意:给定一棵根为 \(1\) 的有根树,每个节点有两个权值 \(a[i]\) 和 \(b[i]\) 。定义 \(R(v)\) 为 \(v\) 祖先的集合(包括自己),则一个节点 \(v\) 有多棒取决于其真棒程度,真棒程度是这样定义的:
\(|x|\) 表示 \(x\) 的绝对值。
现在请你支持两种操作:
- \(1 \ \ v \ \ x\) — 将 \(a_v\) 加上 \(x\)
- \(2 \ \ v\) — 输出以 \(v\) 为根的子树中最大的真棒程度
思路:发现很像区间加区间最大子段和,但是不会处理绝对值。
其实处理绝对值只需把 \(b\) 取反再做一遍即可。
而且这道题求的是单点值,不用维护除了 \(sum\) 之外的信息。
CF1830F The Third Grace
题意:给定一个数轴上的 \(n\) 个区间和 \(m\) 个点。第 \(i\) 个区间覆盖坐标 \([l_i, r_i]\),第 \(i\) 个点在坐标 \(i\) 处,并且具有系数 \(p_i\)。
最初,所有点都未激活。你需要选择一些点来激活。对于每个区间 \(i\),我们定义它的代价为:
- 若区间内没有被激活的点,则代价为 \(0\);
- 否则,代价为在区间内坐标最大的被激活点的系数。
你的任务是通过选择哪些点激活,使得所有区间的代价之和最大。
思路:很厉害的题目。
设 \(f[i]\) 表示以 \(i\) 为最后一个被选中的位置的方案的最大值,其中不包含 \(i\) 的贡献。
考虑怎么转移。枚举下一个位置 \(j\),有 \(f[i]+cnt[i][j]p_i\rightarrow f[j]\),其中 \(cnt[i][j]\) 表示 \(l\le i\le j<r\) 的区间数量。
考虑扫描线来维护所有 \(f[i]+cnt[i][j]p_i\),记为 \(g_i\),那么每次当 \(j\rightarrow j+1\) 时,会对所有 \(r=j\) 的区间 \([l,r]\),令 \(g_i\rightarrow g_i+p_i\)。
这就是 KTT 可解决的问题了。