题解 P10045【[CCPC 2023 北京市赛] 线段树】
题意
给你一个长为 \(n\) 的序列 \(a\),保证 \(a_i\) 是奇数。有两种操作共 \(q\) 次:
- 给定 \(l,r,x\),\(\forall i\in[l,r],a_i\gets a_i+x\),保证 \(x\) 是偶数;
- 给定 \(l,r\),求 \(\prod_{i=l}^ra_i\),对 \(2^{20}\) 取模。
数据范围: \(n,q\le 2\times 10^5\),时限 4s。
思路
题外话:在 qoj vp 的时候没给时限,卡了好久常数才敢交。vp 完后几天在模拟赛上遇见相似套路直接秒了。
因为保证了 \(a_i\) 时刻为奇数,所以不妨设 \(a_i=2b_i+1\)。
所求即为 \(\displaystyle\prod_{i=l}^r(2b_i+1)\),而答案对 \(2^{20}\) 取模,所以展开后不取 \(1\) 的项数最多为 \(19\)。
那么我们建立线段树,对于一个区间 \([l,r]\),我们维护 \(f_i\) 表示 \(\displaystyle\sum_{S,|S|=i}\prod_{j\in S}b_j\),显然只有 \(f_{0\sim 19}\) 可能有值。合并暴力即可。
考虑修改,考虑 \(\displaystyle\sum_{S,|S|=i}\prod_{j\in S}(b_j+x)\),枚举选 \(b\) 的子集 \(T\),\(\displaystyle\sum_{T}\binom{r-l+1-|T|}{|S|-|T|}x^{|S|-|T|}\prod_{j\in T}b_j\),即 \(\displaystyle f'_i=\sum_{j=0}^if_jx^{i-j}\binom{r-l+1-j}{i-j}\),可以依此更新。
令 \(t=20\),则时间复杂度 \(O(nt^2\log n)\)。
看起来很大,但其实合并和更新时带了 \(1/2\) 的常数,再加个标记永久化,用 unsigned 代替取模,实际只用了 2.5s。

浙公网安备 33010602011771号