HDU-3949-XOR(線性基求第K大異或值)
題目連結
題意:
給你n個數,q次詢問,每次詢問在n個數組成的異或集中第K大的數
題解:
這是一個線性基裸模板題,求第k大:把k二進位制拆分,如果k的第i位上是1,ans^=nb[i]
這是什麼道理呢?
異或消元最後得到的是一組基
給出n個數能夠異或出來的值,都是這些基線性組合形成的數
程式碼:
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int maxn=1e5+7;
const int mod=1e9+7;
struct Linear_Basis{
ll b[63],nb[63],tot; //b為線性基 nb用來求第K小異或值 tot為nb元素個數
bool flag=false;
void Init(){ //初始化
tot=0;
flag=false;
memset(b,0,sizeof(b));
memset(nb,0,sizeof(nb));
}
void Ins(ll x){ //插入
for(int i=62;i>=0;i--){
if(x&(1ll <<i)){
if(!b[i]){
b[i]=x;
return;
}
x^=b[i];
}
}
flag=true;
return ;
}
bool Fin(ll x){ //驗證存在性
if(x==0&&b[0])return 1;
for(int i=62;i>=1;i-- ){
int j=i-1;
if(x&(1<<j)){
x^=b[i];
if(!x)return 1;
}
}
return 0;
}
ll Max(ll x){ //求最大值
ll res=x;
for(int i=62;i>=0;i--){
res=max(res,res^b[i]);
}
return res;
}
ll Min(ll x){ //求最小值
ll res=x;
for(int i=0;i<=62;i++){
if(b[i])res^=b[i];
}
return res;
}
ll Rebuild(){ //第K大
for(int i=62;i>=0;i--){
if(b[i]==0)continue;
for(int j=i-1;j>=0;j--){
if(b[j]==0)continue;
if(b[i]&(1ll<<j))b[i]^=b[j];
}
}
for(int i=0;i<=62;i++){
if(b[i])nb[tot++]=b[i];
}
}
ll Kth_Max(ll k){
if(flag)k--; //???
ll res=0;
if(k==0)return 0;
if(k>=(1ll<<tot))return -1;
for(int i=62;i>=0;i--){
if(k&(1ll<<i))res^=nb[i];
}
return res;
}
}LB;
void merge(Linear_Basis &a,Linear_Basis &b){//a和b都變成a+b
for(int i=31;i>=1;i--){
if(b.b[i]==0)continue;
a.Ins(b.b[i]);
}
b=a;
}
int main(){
int t;
scanf("%d",&t);
int tt=1;
while(tt<=t){
int n,q;
ll a;
scanf("%d",&n);
LB.Init();
for(int i=0;i<n;i++){
scanf("%lld",&a);
LB.Ins(a);
}
LB.Rebuild();
scanf("%d",&q);
printf("Case #%d:\n",tt++);
while(q--){
ll k;
scanf("%lld",&k);
printf("%lld\n",LB.Kth_Max(k));
}
}
return 0;
}
相關推薦
HDU-3949-XOR(線性基求第K大異或值)
博主連結 題目連結 題意: 給你n個數,q次詢問,每次詢問在n個數組成的異或集中第K大的數 題解: 這是一個線性基裸模板題,求第k大:把k二進位制拆分,如果k的第i位上是1,ans^=nb[i] 這是什麼道理呢? 異或消元最後得到的是一組基 給出n個數能夠異或
線性基求第k小異或值
ace http ble printf lin 題意 subset %d void 題目鏈接 題意:給由 n 個數組成的一個可重集 S,每次給定一個數 k,求一個集合 \(T \subseteq S\), 使得集合 T 在 S 的所有非空子集的不同的異或和中, 其異或和 \
hdu3949 XOR 線性基 求第k大
題目連結 線性基是AkkingAkkingAkking蠻久之前給我講的 當時這個題沒調出來一直留在這裡 今天才把它填完 按照ylsoiylsoiylsoi的理解線性基就是一個數集 其中的數異或出來能表示出所有加入過這個集合的所有數 我們只需要對於最高位為某一位的
hdu 3949 XOR 求第K小異或值
Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base number A and B, let C=A XOR B, then f
HDU 3949 XOR(線性基)
void scan one lld cstring ons ems stack utc 題意:給出一組數,求最小的第k個由這些數異或出來的數。 先求這組數的線性基。那麽最小的第k個數顯然是k的二進制數對應的線性基異或出來的數。 # include <cstdi
hdu3949(線性基,求第k小的異或和
鏈接 sel time cau int another logs 題目 there 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 XOR Time Limit: 2000/1000 MS (Java/Others)
hdu 3949 XOR (線性基)
amp ems .cn clas bit 需要 http c++ ear 鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 題意: 給出n個數,從中任意取幾個數字異或,求第k小的異或和 思路: 線性基求第k小異或和
HDU - 3949 XOR —— 線性基
題意: 詢問給定的數列裡第k大的異或和 思路: 線性基 將所有數插入線性基之後,所有62個數有的是0,其他數最高位1的位置不相同 用類似高斯消元的方法將線性基變為每個數只有最高位1,這樣就可以方便的求出第k大的異或 最大的異或值一定是這些裡面所有數的異或(全部能為1的位置
hdu3949 XOR(線性基【第k大)
題目連結 分析: 求第k大:把k二進位制拆分,如果k的第i位上是1,ans^=b[i] 這是什麼道理呢? 異或消元最後得到的是一組基 給出n個數能夠異或出來的值,都是這些基線性組合形成的數
[01字典樹]求序列完美度(求區間最大異或值)
函數表 字典 style targe efi cnblogs main code blank https://nanti.jisuanke.com/t/15531 解題關鍵:01字典樹模板,用字典樹保存每個數的二進制表示,從而動態維護區間上的最大異或值,註意添加和刪除都可
spoj 7258 SUBLEX(求第k大字串
top stdin add algo can find size esp con 其實對sam的拓撲排序我似懂非懂但是會用一點了。 /** @xigua */ #include <stdio.h> #include <cmath> #in
poj1442(treap求第k大)
syn div gcd += ace str while pre clu ac代碼: #include<bits/stdc++.h> using namespace std; #define per(i,a,b) for(int i=a;i <=
無序數組求第K大/第K小的數
std name 根據 ide ace mat algorithm cout ios 方法一:quicksort 根據快排思想,從後往前找比基準數小的,交換位置。 從前往後找比基準數大的,交換位置。 最後安放基準數。 保證 l到p 是大數,若 p-l+1==k 那麽p就是第
LeetCode703 Kth Largest Element in a Stream(求第K大元素)
Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth dis
HDU2852 KiKi's K-Number (權值線段樹求第k大)
題意:三種操作,0 e 表示插入一個數字e,1 e 表示刪除一個數字e,2 e k 表示查詢比e大的第k個數,刪除和查詢均可能沒有 目標。 思路:建一棵權值線段樹,維護每個數字區間中數字的數量。 查詢時,先查出1到e的數字數量n,然後查詢第k+n大。 #include<cs
【LOJ】#114. k 大異或和 -線性基&貪心
傳送門:loj114 題解 注意構造的線性基 a i
[poj2828]Buy Tickets(樹狀陣列求第k大)
傳送門 題意: i個人排隊,對於第i個人,我們知道他排在第pi個人後面(可以插隊)且他有一個權值val,我們需要輸出排好之後每個人的權值。 首先我想的是連結串列來模擬,但是發現由於p[i]指的是位置而不是編號,所以連結串列是隻能O(n^2)的。 那麼怎麼辦呢
2018.12.07【LOJ114】k 大異或和(線性基)(高斯消元)
傳送門 解析: 先求一個線性基,然後高斯消元解線性空間,然後基本上就是亂搞把第 k k k
101234G Dreamoon and NightMarket 求第K大集合
1.題意:給你n種物品的價值,讓你求這些物品組合的第k大的集合的值(集合內放的是物品種類,不得重複,但價值可以重複) 2.分析:歸結為一類經典問題,求第K大集合 (1)將陣列排序 (2)假設當前組合中最後一個元素的下標為 i , 考慮為以i為最後一個元素的全排列都舉過了
【LOJ】#114. k 大異或和 -線性基&貪心
題解 注意構造的線性基aia_iai需要滿足:若第i,ji,ji,j位上都有值,則ai&2j=0a_i\&2^j=0ai&2j=0且aj&