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

2022-03-30 07:29:47 字數 783 閱讀 2062

\(otzgengyf\)。。當場被吊打\(qwq\)

我們對每個位置的線性基如此操作:

對於每一位,儲存盡量靠後的數;

所以每一位還要記錄位置。

(後文區分"位"(二進位制位)和"位置"(原陣列中的第幾位),每個位置都有\(30\)位)

具體來說,就是從高位向低位掃,如果我們當前的數能被放入某一位,如果這一位沒有數,則直接放入;否則比較出現位置,如果當前數出現位置較為靠後,就把當前數和這一位的數交換,然後從下一位繼續進行插入。這樣高位上的數會出現的盡量靠後。

查詢的時候,從高位到低位進行查詢。如果需要某位上面的數而這個數出現的位置\(,直接輸出'no'。

#include#include#define r register int

using namespace std;

namespace luitaryi const int n=5e5+10;

#define pc(x) putchar(x)

struct node

node(int _c,int _p):c(_c),p(_p) {}

}f[n][31];

int n,m;

inline void main() {

g(n); for(r i=1,x;i<=n;++i) {

g(x); register node tmp(x,i);

memcpy(f[i],f[i-1],sizeof(f[i-1]));

for(r k=30;~k;--k) if(tmp.c&(1<2019.08.12

88

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 異或湊數(線性基)

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

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