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

2021-08-13 21:57:22 字數 1742 閱讀 2389

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個數字的異或。如果你的演算法...