1. 程式人生 > >HDU-3949-XOR(線性基求第K大異或值)

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(treapk)

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&amp;2j=0a_i\&amp;2^j=0ai​&2j=0且aj&amp;