闲扯
大家 $T1$ 怎么都会写 $O(n\log ^2 n)$ 的算法啊,为啥我只会写带 $\sqrt{n}$ 的莫队啊。。
题面
$T1$
Solution
- 直观的想法
求出 $dfn$ ,每次修改相当于是给一个区间增加和减少一个数。
我们维护一颗线段树,在每个区间设置一颗 $Trie$ 。
区间修改就是给区间的 $Trie$ 加上,减去一个数。
单点询问就是进行 $\log n$ 次求最大异或。
由于是单点询问,我们可以直接标记永久化。
时间复杂度: $O(n\log^2 n)$ ,空间复杂度: $O(n\log^2 n)$ 。
但是空间只有 $128MB$ ,会被卡掉。。
- 优化空间
我们有一个很常见的套路???,将操作离线。
具体的,我们用一颗线段树来维护这些操作。
对于线段树的每一个区间,我们相当于是给了它一个操作序列,每次增加一个数,减少一个数或者进行一次询问。
我们对每一个操作序列,分别用 $Trie$ 来维护,这样时间复杂度依旧是 $O(n\log^2 n)$ ,但是空间上只需要开一个 $Trie$ 就行了。
Code
1 |
|
$T2$
Solution
先考虑 $f(x)$ 怎么计算。
由定义,我们可以得到这样的式子:
$x=1$ 的时候问题等价于抛硬币,问抛到正面的期望步数。
当 $x=2n$ 时,二进制下最后一位为 $0$ ,无论加减 $lowbit(x)$ 都与它无关,所以步数和将它去掉是相等的。
当 $x=2n+1$ 时,加减 $lowbit(x)$ 分别等于 $x-1,x+1$ ,都为偶数,带入上面的式子即可。
我们继续考虑怎么求出 $S(x)$ 。
还是分类讨论。
- $x=2n$
我们将 $S(x)$ 按照 $i$ 的奇偶性分为两半。
- $x=2n+1$
与上面一样的方法,可以解得:
然后我们就可以直接记搜了。
时间复杂度: $O(T\log^2n)$ 。(大概是这样)
Code
1 |
|