Loading

做题笔记(三)

经典问题:求解区间 \(k\) 个不交子段的和的最大值。

对于没有修改的版本,我们采用 P6821 [PA2012] Tanie linie 的做法,首先将原序列连续的正(负)数缩成一个数,然后用加入正数,不断减少连续段(加入负数和删除正数),用堆维护即可。

对于修改版本,我们用线段树维护区间最大子段和以及位置,每次取出最大的子段和,然后区间取反,也就是模拟费用流的思想。

经典问题:利用主席树优化二进制高精度加法和比较。

加法形如区间清空和单点赋值,可以线段树上二分解决,清空就是删除节点,比较可以记录每个点的哈希值,然后线段树上二分第一个不一样的位置即可。

首先利用线段树上二分求得和答案等价的一组偏序关系。

变成经典问题:\(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}\)

bitset 优化字符串匹配的模板。

记录每种字符出现的位置,区间询问的话就差分答案即可。

经典问题:求给定序列有多少种排列使得相邻元素都不相同。

考虑容斥,求出钦定有 \(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)\)

关键在于对于划分唯一的分配方式,对于一个点,钦定其贡献到最近的(有信息的)祖先,那么直接流就可以了。

posted @ 2024-11-12 11:44  紊莫  阅读(61)  评论(1)    收藏  举报