從左到右一共n個數,數字下標從1到n編號。
一共m次詢問,每次詢問是否能從第l個到第r個數中(包括第l個和第r個數)選出一些數使得他們異或為k。
資料量比較大。
輸入請用掛
1
23
4
5
6
7
8
intread()
輸出請用puts
input
單組測試資料。input示例第一行乙個整數n(0output
m行,每行為yes或no
5output示例1 1 2 4 6
31 2 1
2 4 8
3 5 7
yesnono
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
線性基~
如果只有乙個固定區間,我們只需要求出線性基再貪心地異或即可得出答案。
所以關鍵即在於怎樣求出區間內的線性基。有一種神奇的方法(不知道為什麼,網上學的):我們以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個數字的異或。如果你的演算法...