CF280D - k-Maximum Subsequence Sum \(\text{diff : } 2800\)
经典问题:求解区间 \(k\) 个不交子段的和的最大值。
对于没有修改的版本,我们采用 P6821 [PA2012] Tanie linie 的做法,首先将原序列连续的正(负)数缩成一个数,然后用加入正数,不断减少连续段(加入负数和删除正数),用堆维护即可。
对于修改版本,我们用线段树维护区间最大子段和以及位置,每次取出最大的子段和,然后区间取反,也就是模拟费用流。
CF464E - The Classic Problem \(\text{diff : } 3000\)
经典问题:利用主席树优化二进制高精度加法和比较。
加法形如区间清空和单点赋值,可以线段树上二分解决,清空就是删除节点,比较可以记录每个点的哈希值,然后线段树上二分第一个不一样的位置即可。
CF1558D - Top-Notch Insertions \(\text{diff : } 2600\)
首先利用线段树上二分求得和答案等价的一组偏序关系。
变成经典问题:\(a _ 1 \oplus a _ 2 \oplus \dots \oplus a _ n\),\(\oplus\) 中有 \(c\) 个小于号,\(n - 1 - c\) 个小于等于号,求 $a _ i \in [1, n] \cap \mathbb{N} $ 的方案。
考虑把 \(a _ i \le a _ {i + 1}\) 变成 \(a _ i < a _ {i + 1} + 1\),这样的话原序列的值域就变成了 \(n + n - 1 - c = 2n - c - 1\),最后的答案就是 \(\binom{2n - c- 1}{n}\)。
CF914F - Substrings in a String \(\text{diff : } 3000\)
bitset 优化字符串匹配的模板。
记录每种字符出现的位置,区间询问的话就差分答案即可。
CF840C - On the Bench \(\text{diff : } 2500\)
经典问题:求给定序列有多少种排列使得相邻元素都不相同。
考虑容斥,求出钦定有 \(i\) 对相邻元素相同的方案 \(f _ i\),答案就是 \(\sum \limits_{i = 0}^{n - 1}(-1)^i f _ i\)。
考虑先计算无标号有颜色的小球计数,最后乘上 \(\prod s_i!\) 即可(\(s _ i\) 表示某种颜色小球的个数),发现不同的组合对象互不影响,那么先计算 \(g _ {i,j}\) 表示对于第 \(i\) 种小球,划分出 \(j\) 对相邻元素的方案。
\[g _ {i,j} = \dfrac{\binom{s _ i - 1}{j}}{(s _ i - j)!} \]含义是在 \(s _ i - 1\) 个空隙种选出 \(j\) 个,然后把序列缩起来,有 \(s _ i - j\) 个连通块,这些连通块之间的顺序是无所谓的,那么要除掉。
最后卷积起来就可以了,时间复杂度 \(\mathcal{O}(n^2)\) 或者 \(\mathcal{O}(n \log^2 n)\)。
CF1061E - Politics \(\text{diff : } 2600\)
关键在于对于划分唯一的分配方式,对于一个点,钦定其贡献到最近的(有信息的)祖先,那么直接流就可以了。
标签:text,线段,笔记,序列,区间,diff,oplus From: https://www.cnblogs.com/z-t-rui/p/18541514