题解 P10045【[CCPC 2023 北京市赛] 线段树】

\(\text{Link}\)

题意

给你一个长为 \(n\) 的序列 \(a\),保证 \(a_i\) 是奇数。有两种操作共 \(q\) 次:

  1. 给定 \(l,r,x\)\(\forall i\in[l,r],a_i\gets a_i+x\),保证 \(x\) 是偶数;
  2. 给定 \(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。

posted @ 2024-01-02 20:43  ffffyc  阅读(160)  评论(0)    收藏  举报  来源