【NOTE】Part 4
子集和\(\text{DP}\)
如 求解 \(f[S]=\sum\limits_{T\subseteq S}w[T]\)
枚举所有子集复杂度高达 \(2^{bitsum(S)}\)
设 \(g[S][i]\) 表示集合 \(S\) 后 \(i\) 位变换得到子集的价值和。
则:
显然也可以把后面那维压掉。也即:
树状数组/线段树维护 \(n\) 阶前缀和
区间查询相当于单点查询加一阶。这里考虑单点查询。默认操作为区间加。
零阶
树状数组
差分后单点加
线段树
乱杀,略
一阶
树状数组
差分得负一阶数组 \(E\)
则零阶 \(B_i=\sum\limits_{j=1}^i E_j\),一阶 \(A_i=\sum\limits_{j=1}^i B_j\),则
开两个树状数组,分别维护 \(E_k\) 和 \(k \times E_k\) 就可以了。
线段树
乱杀,略
二阶
树状数组
做法跟上面差不多。分别用 \(C,B,A\) 表示零阶,一阶,二阶。
分别维护 \(E_k\), \(k \times E_k\), \(k^2 \times E_k\) 就可以了。
线段树
转化为区间加等差数列。
给线段树的每个结点打 \(lazytag\),保存等差数列首项以及公差。
这个 \(tag\) 很显然很容易叠加(等差数列之和也是等差数列)
多阶
树状数组
理论上 \(n\) 阶前缀和可以使用 \(n\) 个树状数组用类似上面的方法来维护。
树状数组比线段树多一阶,区间修改比单点修改多一阶,区间查询比单点查询多一阶()就这样()
标记永久化
好像就是信息直接打在对应区间节点上而不下传而已。
一个节点的信息转化为到根的链上所有信息合并。
主席树可以通过这玩意实现区间加。相当于只修改 \(log\) 个线段树结点。
兔队线段树
楼房重建,好像是这个题吧
求严格前缀最大值的数量,带修
线段树区间合并的信息通过往线段树下爬一条 log 的链得出,很喵喵。
曼哈顿距离与切比雪夫距离的转化
曼哈顿距离(四连通距离):\(|x-x_1|+|y-y_1|\)
切比雪夫距离(八连通距离):\(\max(|x-x_1|,|y-y1|)\)
曼哈顿距离 \((x,y)\) \(\longrightarrow\) 切比雪夫距离 \((x+y,x-y)\)
曼哈顿距离转为切比雪夫距离,把菱形转化到正方形。
例如转化为求到某个点切比雪夫距离 \(\leq x\) 的点的个数,就可以变成求矩形内的点数。(矩形内点数可以二维前缀和或者主席树,求第 \(k\) 大 可以二分距离判断距离内点个数..)
切比雪夫距离 \((x,y)\) \(\longrightarrow\) 曼哈顿距离 \((\frac{x+y}{2},\frac{x-y}{2})\)
切比雪夫距离转为曼哈顿距离,可以分两个坐标来讨论(?)或者是转化为二维数点?
比如给定平面上一些点,快速求出一系列点到其中某个点的切比雪夫距离,就可以先转化为曼哈顿距离然后按照两维坐标排序求前缀和。(由于曼哈顿是求和两维答案互不影响)
范德蒙恒等式
组合意义:在一个大小为 \(n+m\) 的集合中取出 \(k\) 个数,可以等于把大小为 \(n+m\) 的集合拆成两个集合,大小分别为 \(n\) 与 \(m\),然后从 \(n\) 中取出 \(i\) 个数,从 \(m\) 中取出 \(k-i\) 个数的方案数。

浙公网安备 33010602011771号