1. 程式人生 > >正睿提高組2017模擬題三T1

正睿提高組2017模擬題三T1

樹狀數組 這位 可能 復雜 如果 答案 進制 簡單的 相同

聽了很久又看了很久別人的程序才聽懂,於是乎記錄一下防止以後忘記。

好啦,假設當前

l-1=5,r=7;那如果學習過樹狀數組的話就知道題目中的操作如果轉換為二進制的話

對於l-1來說他的二進制是101,所以會被加上-1的位置是101和100,r的二進制是111,所以會被加上1的位置是111,110,100

所以可以發現最後更新的位置是l-1的二進制的1的個數+r的二進制的1的個數-2*l-1和r都會更新的位置。

而l-1和r減1都會更新的位置的個數是它們兩個二進制的最長公共前綴的1的個數(當然,前提是兩個二進制的長度相等,要不然更新的位置不可能相同)

那先從簡單的開始討論,我們假設當前的n=1000000(64)

位數i:6 5 4 3 2 1 0

數字:1 0 0 0 0 0 0

方法一:

我們來討論當前在第i位數字如果是1的話在多少組l-1和r中這個位置是會被更新的(不會抵消),假設i=4

比如說0110000這個數字中的第四位數和0~n這幾個數字中的哪些數字是不起沖突可以更新答案的,很明顯位數與它不同的肯定不會有矛盾,和它前綴不同的也不可能有矛盾

所以只有0110000~0111111這幾個數會和0110000抵消也就是2^4個數,所以這個數能貢獻的就是總共的n+1個數減去2^4,好同理而論,在討論第i位的時候與0110000這個數類似的數總共有2(也就是當第四位的前綴為00~01,總共兩種可能)*(2^4)(後面是0000~1111),再乘上之前的(n+1-2^4)就是這位數能為答案貢獻的大小。

但是還有另外一種情況,假設n=101111,還是討論第4位數,你會發現除了上面提到的,還有101000~101111這些數是有可能對答案貢獻的,假設這樣的數有x個,與上面相同

總貢獻就是x*(n+1-x)。所以我們在算每一個數的時候如果當前的這位數為1那麽還要再額外多計算一項。

額復雜度基本上就是n的二進制的位數了吧。。。所以跑的飛快。。。

方法二:

哈,數位dp的方法等下再寫。。。

正睿提高組2017模擬題三T1