第 k 大區間
題目連結:第 k 大區間
因為k很大,顯然可以想到二分。利用字首異或和變成兩個點的異或。然後就是列舉每一個字尾,求異或大於某個數的個數。
直接Trie上查詢即可。
AC程式碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,k,a[N],ch[N*32][2],sz[N*32],idx;
inline void insert(int x){
int p=0;
for(int i=30;i>=0;i--){
int k=x>>i&1;
if(!ch[p][k]) ch[p][k]=++idx;
p=ch[p][k]; sz[p]++;
}
}
inline int ask(int x,int mid){
int p=0,s=0,cnt=0;
for(int i=30;i>=0;i--){
int k=x>>i&1;
if(s+(1<<i)>=mid) cnt+=sz[ch[p][k^1]],p=ch[p][k];
else s+=(1<<i),p=ch[p][k^1];
if(!p) return cnt;
}
return cnt;
}
inline int check(int mid){
int sum=0,s=0;
memset(ch,0,sizeof ch),memset(sz,0,sizeof sz),idx=0;
insert(0);
for(int i=1;i<=n;i++){
s^=a[i],sum+=ask(s,mid);
insert(s);
}
return sum>=k;
}
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
int l=0,r=4e9;
while(l<r){
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}
相關文章
- 第八大奇蹟【區間查詢第8大數】
- 藍橋杯-k倍區間
- abc343F 區間第2大的出現次數
- nth_element 找第k大的數
- 快排思想O(N)求第k大數
- 查詢陣列中第K大的元素陣列
- 無序陣列求第K大的數陣列
- 尋找陣列中第K大的元素陣列
- 區間k小值(可持久化線段樹)持久化
- C++實現 藍橋杯 k倍區間C++
- 第k大元素
- 【字典序第k小】
- 獲取一個陣列裡面第K大的元素陣列
- 2017藍橋杯省賽第十題:k倍區間
- P3358 最長k可重區間集問題
- i7-8086K深度評測:i7-8086K和8700K區別大嗎?
- 1106: 找第K位數
- 找出陣列中第 k 大的數字及其出現次數陣列
- 每日一練(26):二叉搜尋樹的第k大節點
- TopK問題,陣列中第K大(小)個元素問題總結TopK陣列
- [LeetCode] K-th Smallest Prime Fraction 第K小的質分數LeetCodeFraction質分數
- 區間dp
- 劍指 Offer 54. 二叉搜尋樹的第k大節點 mark
- 程式碼隨想錄演算法訓練營第第36天 | 452. 用最少數量的箭引爆氣球、435. 無重疊區間、763.劃分字母區間演算法
- 力扣 - 劍指 Offer 54. 二叉搜尋樹的第k大節點力扣
- 《JVM第7課》堆區JVM
- K大數查詢
- 陣列中的第K個最大元素陣列
- 連結串列倒數第k個結點
- 選擇問題(求第k個最小元素)
- 遞迴 | 第k個語法符號(Python)遞迴符號Python
- 區間縮小
- 區間合併
- 合併區間
- 每日一題 - 劍指 Offer 54. 二叉搜尋樹的第k大節點每日一題
- 芻議線段樹 2 (區間修改,區間查詢)
- 樹狀陣列的區間查詢與區間修改陣列
- POJ 2376 Cleaning Shifts(區間貪心之區間覆蓋)