[清华集训2012] 序列操作 题解
一道线段树黑题(虽然不难,真实难度估计只有 省选\(\ -\))
给定一个序列,三种操作:
1.区间加
2.区间取相反数
3.询问 \([l,r]\) 中,任取 \(c\) 个整数相乘(显然有\(\tbinom{n}{m}\) 种方案)的所有方案获得的数之和等于多少(对 19940417 取模)
\(n, m \leq 5e4 , c \leq 20\)
首先,模数不是个质数,只能递推求出组合数(毕竟 \(c\) 又不大)
然后观察这个 \(c\) (Os:这个\(c\) 怎么这么小啊!) , 显然我们可以把每个区间选 0~20 个数的答案都算出来,时间空间都没问题。
然后考虑用线段树再怎么做。 很容易想到,如果下传标记的话,2操作的标记优先级一定是比1操作的标记的优先级要高的(显然), 所以要注意一下 \(pushdown\) 的优先级。
考虑 \(pushup\) : 从组合意义(?)角度考虑下可得式子: \(ans_{x,i} = \sum_{j=0}^{i-1} ans_{lson,j} \times ans_{rson,i-j}\)
可以很容易的想到一点:取反之后 对于取 \(k\) 个数的情况,如果 \(k\) 是奇数,则答案取相反数,否则不变。
那么问题来了: 加法咋办?
将式子展开可以发现, 加法得到的式子可以用杨辉三角即组合数表示出来,只要提前递推出来杨辉三角然后用 \(O(c^2)\) 时间修改(包括\(pushdown\))即可完成。 总复杂度显然是 \(O(c^2 n logn)\) 的
\(Code:\) 代码传送门
浙公网安备 33010602011771号