不删序列连续段
不删序列连续段
问题形式
\(1\sim n\) 共 \(n\) 个元素,初始所有元素都非法,每次操作令一个元素合法,对于给定的 \(f:([1,n]\cap\N)\times([1,n]\cap \N)\mapsto S\),和 \(+:S\times S\mapsto S\),设极长合法连续段集为 \(I\),维护 \(\sum_{(l,r)\in I}f(l,r)\),满足信息可差分且有交换律和结合律
求解
- 维护数组 \(p_{1\sim n}(p_i\in[1,n]\cap \N)\) 和 \(v_{1\sim n}(v_i\in S)\),初始 \(p_i\gets 0\),\(v_i\) 未初始化,信息总和 \(s=\sum_{(l,r)\in I}f(l,r)\) 初始为空
- 加入位置 \(u\) 时,令 \(p_u=u\),\(v_u=f(u,u)\)
- 若 \(u>1\) 且 \(p_{u-1}\ne 0\),则将 \([p_{u-1},u-1]\) 和 \([u,u]\) 合并
- 若 \(u<n\) 且 \(p_{u+1}\ne 0\),则将 \([p_u,u]\) 和 \([u+1,p_{u+1}]\) 合并
- 其中合并 \([l,M]\) 和 \([M+1,r]\) 时,令 \(p_l\gets r,p_r\gets l,s\gets s-v_l-v_r,v_l\gets f(l,r),s\gets s+v_l\)
- 此时的答案为 \(s\)
总时间复杂度 \(O(n)\)

浙公网安备 33010602011771号