2021牛客暑期多校训练营3 I Kuriyama Mirai and Exclusive Or 差分 + 二进制分治
傳送門
文章目錄
- 題意:
- 思路:
題意:
給你一個數組aaa,讓你實現以下兩個操作之后輸出數組aaa。
n≤6e5,ai≤230?1n\le6e5,a_i\le2^{30}-1n≤6e5,ai?≤230?1
思路:
下面介紹的思路清奇,反正我想不到。
對于兩個操作,顯然對于異或操作順序是沒有影響的,所以對于第一個操作可以直接打個差分即可。
對于第二個操作,我們本能的想把括號拆開,但是括號中是加法對于異或來說沒有分配律,所以考慮(x+(i?l))(x+(i-l))(x+(i?l))將加法轉換成或,假設xxx的111的最低位置在2k2^k2k處,如果i?l<2ki-l<2^ki?l<2k,那么此時(x+(i?l))=(x∣(i?l))(x+(i-l))=(x|(i-l))(x+(i?l))=(x∣(i?l)),此時ai⊕(x+(i?l))=ai⊕(x∣(i?l))=ai⊕x⊕(i?l)a_i\oplus (x+(i-l))=a_i\oplus (x|(i-l))=a_i\oplus x \oplus (i-l)ai?⊕(x+(i?l))=ai?⊕(x∣(i?l))=ai?⊕x⊕(i?l),也就是先讓iii位置異或上xxx,讓后讓[i,i+2k?1][i,i+2^k-1][i,i+2k?1]的位置分別異或上0,1,...,2k?10,1,...,2^k-10,1,...,2k?1。所以我們記一個f[k][i]f[k][i]f[k][i]數組表示是否需要將[i,i+2k?1][i,i+2^k-1][i,i+2k?1]的位置分別異或上0,1,...,2k?10,1,...,2^k-10,1,...,2k?1,之后將x+(1<<k),l+(1<<k)x+(1<<k),l+(1<<k)x+(1<<k),l+(1<<k)即可。
這樣一直推下去,到最后會剩下一段小區間,這段區間我們直接倒著來一遍即可,因為他的后k?1k-1k?1位都是000,所以也滿足上面的性質。
我們記了一個fff數組,個人感覺怎么用它也是一個比較難想到的點。我們可以用類似倍增實則是倍增的逆過程來遞推下去,是一種分治的思想。
考慮當前遍歷到了f[i][k]f[i][k]f[i][k],那么我們可以將其分成兩段來看,兩段分別是[i,i+2k?1?1],[i+2k?1,i+2k?1][i,i+2^{k-1}-1],[i+2^{k-1},i+2^{k}-1][i,i+2k?1?1],[i+2k?1,i+2k?1]。
對于第一段,我們直接將f[i][k?1]f[i][k-1]f[i][k?1]標記一下,讓后等分治下去處理即可。對于
對于第二段,我們將f[i+2k?1][k?1]f[i+2^{k-1}][k-1]f[i+2k?1][k?1]標記一下,這樣還不夠,因為這一位及其之后應該異或上2k?1,2k?1+1,...,2k?12^{k-1},2^{k-1}+1,...,2^k-12k?1,2k?1+1,...,2k?1,根據上面的轉換公式,我們可以將i+2k?1i+2^{k-1}i+2k?1差分數組的位置異或上2k?12^{k-1}2k?1即可,這樣就可以不斷的分治遞推下去,代碼寫起來很像倍增的逆過程。。
總結
以上是生活随笔為你收集整理的2021牛客暑期多校训练营3 I Kuriyama Mirai and Exclusive Or 差分 + 二进制分治的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚂蚱的功效与作用、禁忌和食用方法
- 下一篇: 五皮风的功效与作用、禁忌和食用方法