演算法 線性基求異或和第k大

2022-03-06 13:38:00 字數 870 閱讀 1783

題目鏈結

如果說,線性基中異或的最大數(的二進位制形式)是一串連續的,沒有帶後續0的1,那相信聰明的你一定會求第k大,因為第k大其實就是k。

現在相當於告訴你在這一串1中夾了很多0,問你第k大是多少。那麼你其實可以不用管中間的0,把k的二進位制形式弄出來,然後把中間省略0給插回去就好了。

解釋一下就相當於把線性基異或後出來的最大值裡的所有1都給擠到最後,然後求出第k大,再把你弄走的0給丟回去。

eg:異或後最大值為101100110,問第20大

擠到後面去後成11111,第k大是10100,把0插回去成為100100000,第20大便是100100000

顯然的證明:隨便弄出兩個數,把他們轉成2進製,然後去掉非公共的0,發現兩個數的相對大小關係不變。兩個數的大小比較相當於在他們位數相同(或添上前導0後位數相同)的情況下比他們的字典序,而除去公共0後字典序的相對關係是不變的。

嗯就是這樣,記得特判可不可以異或出0。

#include using namespace std;

int n,m,tot = 0;

long long a[1000005];

long long k[61],tt,x,cnt;

bool flag = 1;

void insert(long long x)

} return ans;

}int main()

scanf("%d",&m);

for (int i = 0;i <= 60;i++)

if (k[i]) cnt++;

} for (int i = 1;i <= m;i++)

return 0;

}

hdu 3949 XOR 線性基 第k小異或和

給定 n 個數,對其每乙個子集計算異或和,求第 k 小的異或和。先求得線性基。同上題,轉化為求其線性基的子集的第k小異或和。記 n 個數的線性基為向量組 b 有b i p i 1,p 1 lt p 2 lt lt p t 記 k 的二進位制表示為向量 vec 則第 k 小異或和為 oplus i 1...

LOJ114 K大異或和 線性基

給出乙個n 1 e5 n leq1e5 n 1e 5的可重集合,求這個集合的第k kk小異或和。首先直接對n nn個數消元,然後把高位之後的1 11也盡可能消去,取出所有的非零的基向量。特判掉可能為0 00的情形 當且僅當非零基向量小於元素個數 剩下的t tt個基向量共有2t 12 1 2t 1 種...

LOJ 114 K大異或和 線性基

題目鏈結 需要注意如果線性基中表示的向量不足n個,說明一定存在一組向量滿足線性相關關係,即存在xor和為0的情況。這樣要使k減1。判斷是k 1 include include define gc getchar define maxin 100000 define gc ss tt tt ss in...