description
從左到右一共
n 個數,數字下標從1到
n 編號。一共m
次詢問,每次詢問是否能從第
l 個到第
r個數中(包括第
l 個和第
r個數)選出一些數使得他們異或為
k 。
資料量比較大。
輸入請用掛
int
read()
輸出請用pu
tsinput
單組測試資料。
第一行乙個整數n(
0500,
000)
。 第二行n
個整數,
0《每個數<230
。 第三行乙個數
m ,表示詢問次數(0
500,
000)
。 接下來
m 行每行三個數,l,
r,k(
0r≤n,
0<
k<230
)。outputm
行,每行為ye
s或no
sample input5
1 1 2 4 6
3 1 2 1
2 4 8
3 5 7
sample output
yes
no no
solution只要
k 可以被區間[l
,r]的線性基錶出則ye
s ,問題在於如何預處理每個區間的線性基,考慮固定左端點的線性基,那麼問題變為求從
l 開始的字典序最小的線性基,從n到
1 列舉
l,如果當前數和已有線性基無關則直接加入到線性基中,否則判斷這個數的位置和其對應的基編號大小,如果當前數編號較小則將當前數加入基中,把原先的基拿出來繼續消元即可
code
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
namespace fastio
}return *p1++;
}inline
bool blank(char ch)
inline
void read(int &x)
#undef buf_size
};using
namespace fastio;
typedef pairp;
const
int maxn=500005;
int n,m,a[maxn];
struct node
; node(int _val,int _pos)
}base[maxn][30];
int main()
else
if(k)puts("no");
else
puts("yes");
}return
0;}
51nod 1577 異或湊數
從左到右一共n個數,數字下標從1到n編號。一共m次詢問,每次詢問是否能從第l個到第r個數中 包括第l個和第r個數 選出一些數使得他們異或為k。資料量比較大。輸入請用掛 1 23 4 5 6 7 8 intread 輸出請用puts input 單組測試資料。第一行乙個整數n 0output m行,每...
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個數字的異或。如果你的演算法...