bzoj 5092 分割序列(貪心 高維字首和)

2021-08-16 16:01:28 字數 643 閱讀 7648

傳送門biu~

對b序列求字首亦或和a,求對於每乙個i,a[i]^a[j]+a[j]的最大值。可以把每個a[i]看成各個二進位制位的集合。

對於第i個字首a[i],考慮a[i]每乙個二進位制位對答案的貢獻。如果a[i]的第j位為1,那麼這一位對答案的貢獻一定為1;如果a[i]的第j位為0,那麼這一位對答案的貢獻可能是0或1+1=2。

對於乙個數state,令f[state]表示state的超集(state的超集即所有包含state集合的所有集合)中的所有等於某個a的元素裡,a陣列下標最小的那個。

對於每乙個i,貪心從最高位向低位找非0位並盡量將這個點的貢獻變成2,維護乙個state表示已經確定的哪些位的貢獻變成了2,在state的超集中選滿足條件的,這樣貪心選取一定是最大的,最後輸出a[i]+(state<<1),因為state每一位的貢獻為2。

#include

#define n 300005

#define m 2000005

using

namespace

std;

int n,a[n],f[m];

int main()

for(int i=19;i>=0;--i)

return

0;}

bzoj 5092 分割序列 高維字首和

題目 首先,處理出異或字首和 s i i 位置的答案就是 s j s j s i j i 異或的套路是按位考慮,但是這裡有加法.怎麼考慮進製?所以就不能考慮答案的這一位是什麼,而應該考慮在這一位上的貢獻,那麼即使進製了,還是各位算各位的貢獻,互相獨立 然後發現,如果 s i 在第 k 位上是1,那麼...

659 分割陣列為連續子串行 貪心演算法 中等

給你乙個按公升序排序的整數陣列 num 可能包含重複數字 請你將它們分割成乙個或多個長度至少為 3 的子串行,其中每個子串行都由連續整數組成。如果可以完成上述分割,則返回 true 否則,返回 false 示例 1 輸入 1,2,3,3,4,5 輸出 true 解釋 你可以分割出這樣兩個連續子串行 ...

bzoj1048 HAOI2007 分割矩陣

將乙個a b 的數字矩陣進行如下分割 將原矩陣沿某一條直線分割成兩個矩陣,再將生成的兩個矩陣繼續如此分割 當然也可以只分割其中的乙個 這樣分割了 n 1 次後,原矩陣被分割成了 n 個矩陣。每次分割都只能沿著數字間的縫隙進行 原矩陣中每一位置上有乙個分值,乙個矩陣的總分為其所含各位置上分值之和。現在...