算是 Ynoi 里面较简单和套路的一题吧。
题意简述
给定一个初始长为 $n$ 的数组 $A$ ,有 $m$ 个操作:
- 在末尾加入 $x$。
- 求 $\sum\limits_{i=l}^{r} A_i$。
- 将整个数组异或上 $x$。
- 将整个数组排序。
$n, m\le 10^5, 0\le x, a_i \le 10^9$,不必强制在线。
主要思路
没有操作 1 的话大家都会,只要建棵 Trie 就能 $O(\log^2 W)$ 求最小的 $k$ 个数的和。($O(W)$ 为值域)
大概就是每个点 $O(\log W)$ 空间存一下子树内每一位分别为 $1$ 的数的个数。
那么现在加上在末尾插入的操作,显然整个数列是前面一段有序的和后面一段无序的。无序的显然可以直接前缀和一下,$O(\log W)$ 求出某一段的和。
如果需要排序整个序列,就把前缀和清零一下,然后把每个未排序的数扔到 Trie 里去,单次 $O(\log^2 W)$。每个数只会进入 Trie 一次,故总复杂度 $O((n + m) \log^2 W)$ 。
参考代码
1 |
|