51nod 1577 異或湊數

2021-08-02 17:45:35 字數 1168 閱讀 9684

從左到右一共n個數,數字下標從1到n編號。

一共m次詢問,每次詢問是否能從第l個到第r個數中(包括第l個和第r個數)選出一些數使得他們異或為k。

資料量比較大。

輸入請用掛

1

23

4

5

6

7

8

intread()

輸出請用puts

input

單組測試資料。

第一行乙個整數n(0output

m行,每行為yes或no

input示例

5

1 1 2 4 6

31 2 1

2 4 8

3 5 7

output示例

yes

nono

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

線性基~

如果只有乙個固定區間,我們只需要求出線性基再貪心地異或即可得出答案。

所以關鍵即在於怎樣求出區間內的線性基。有一種神奇的方法(不知道為什麼,網上學的):我們以f[i]表示[i,n]的線性基,那麼f[i]可以由f[i+1]推得,只要處理a[i]即可。我們把a[i]不斷與已有線性基比較,如果當前沒有這種線性基,就記錄下來;如果已有,就保留編號較小的乙個。

最後不斷貪心地把k與f[l](要求標號<=r)異或,當最後k==0時,就是yes。

#include#include#includeusing namespace std;

int n,t,a[500001],l,r,k;

struct nodef[500002][30],tmp;

int read()

while(ch>='0' && ch<='9')

return x*f;

}int main()

; for(int j=29;~j;j--)

if(tmp.x&(1tmp.x^=f[i][j].x;}}

} t=read();

while(t--)

if(!k) puts("yes");

else puts("no");

} return 0;

}

51Nod 1577 異或湊數(線性基)

description 從左到右一共 n 個數,數字下標從1到 n 編號。一共m 次詢問,每次詢問是否能從第 l 個到第 r個數中 包括第 l 個和第 r個數 選出一些數使得他們異或為 k 資料量比較大。輸入請用掛 int read 輸出請用pu tsinput 單組測試資料。第一行乙個整數n 05...

51nod 1577 異或湊數 線性基的妙用

otzgengyf 當場被吊打 qwq 我們對每個位置的線性基如此操作 對於每一位,儲存盡量靠後的數 所以每一位還要記錄位置。後文區分 位 二進位制位 和 位置 原陣列中的第幾位 每個位置都有 30 位 具體來說,就是從高位向低位掃,如果我們當前的數能被放入某一位,如果這一位沒有數,則直接放入 否則...

51nod 2128 字首異或

傳送門 輸入乙個長度為n 1 n 100000 陣列a 1 a 2 a n 輸入乙個詢問數m 1 m 100000 和m組詢問,每組詢問形如 l,r 對於每組詢問 l,r 你需要輸出a l xor a l 1 xor xor a r 1 xor a r 即第l個數字到第r個數字的異或。如果你的演算法...