给你一个序列,在线地支持两个操作:
将一个区间循环移位。
查询一个区间中某个数出现的次数。
两个方法
- 分块 维护块内元素出现次数,修改和更新用双向队列都很显然。$O((n+m)\sqrt{n})=1700ms$
- 平衡树,第一个操作很好解决,对于第二个操作,首先我们只能维护$t_i$这个数字平衡树出现的相对位置,而不能维护绝对位置。但是我们可以通过一开始构造原序列的平衡树的映射,就可以知道某个值在原序列第几个位置,这里需要$O(\log n)$。我想知道$[1,r]$之间$i$出现了几次,平衡树上通过这个查询二分即可。总复杂度$O(n+m\log^2 n)=300ms$
平衡树
1 |
|
分块
1 |
|