[set] [cdq分治] CF848C Goodbye Souvenir
posted on 2024-06-20 06:09:20 | under | source
首先画个图,把值相同的元素拎出来,那么它们的值就是最右边的下标减去最左边的下标,可以等价地看成这些元素构成的线段的长度,那么我们拆贡献,计算每一小段就好了。
也就是说,记 \(nxt_i\) 为 \(a_i\) 右边第一个与它相等的元素下标,这样答案就是:\(\sum\limits_{i=l}^r (nxt_i-i)[nxt_i\le r]\)。
假如无修的话随便拿个数据结构艹过去就好了。这题带修,所以考虑 \(\rm cdq\) 分治,同时用 \(set\) 维护 \(nxt\)。
假如将 \((i,nxt_i,time,val)\) 视作四元组。令 \(i,nxt_i,time\) 均较小者 \(A\) 向 \(B\) 产生 \(val\) 的贡献,那么就将问题转化为了三维偏序。
\(time\) 在记录当前修改次数。假如要让 \(nxt_i\) 从 \(bef\) 改成 \(now\),那么加入两个四元组 \((i,bef,time,i-bef),(i,now,time,now-i)\) 就好了。
令 \(n,m\) 同阶。于是在 \(O(n\log^2 n)\) 内解决此问题。

浙公网安备 33010602011771号