Loj6061. 「2017 山东一轮集训 Day1」Sim

Loj6061. 「2017 山东一轮集训 Day1」Sim

离线,忽略删除操作之后,为每次插入的数编号(不考虑值,仅考虑位置)。

用树状数组+链表可以确定每一个被插入的数的位置。

接下来维护序列,每一个位置有两个值: \((A_i,P_i)\) 。其中 \(A_i\) 为权值, \(P_i\) 为这一个值上次出现的位置。

由于查询操作只考虑不同的元素,即对于区间 \([l,r]\) ,我们只考虑其中 \(P_i<l\) 的部分。

如果一个位置还没有被加入序列,或者已经被删除,将其标记为 \(P_i=\infty\) 即可。用树状数组可定位 \(l,r\) 在重构序列中的位置。

此时,问题变成了单点修改,二维区间查询。

维护和,两个元素积的和,三个元素积的和即可处理操作1,操作5即数点。

动态二维数点可以通过分块或者树套树处理。