bzoj 3689 異或之 字典樹 堆

2021-08-02 15:54:40 字數 918 閱讀 6947

給定n個非負整數a[1], a[2], ……, a[n]。對於每對(i, j)滿足1 <= i < j <= n,得到乙個新的數a[i] xor a[j],這樣共有n*(n-1)/2個新的數。求這些數(不包含a[i])中前k小的數。

2 <= n <= 100000; 1 <= k <= min;0 <= a[i] < 2^31

先對所有數建一棵字典樹,對字典樹的每個節點記錄這個節點下有多少個數,這樣的話就資瓷查詢乙個數的第k小異或數了。

那麼我們先把每個數的第二小數放進堆裡面(第一小肯定是自己),每次取堆頂,加上當前的數是第k大,則把第k+1大扔進去即可。

當取堆頂的次數為奇數時輸出,因為每個數會被取兩次。

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=100005;

int n,m,bin[35],cnt,ch[n*40][2],size[n*40],now[n],a[n];

struct data

};priority_queueq;

int read()

while (ch>='0'&&ch<='9')

return x*f;

}void ins(int x)

}int query(int d,int l,int x,int y)

int main()

for (int i=1;i<=n;i++) now[i]=2,q.push((data));

for (int i=1;i<=m*2-1;i++)

return

0;}

bzoj3689 異或之 字典樹 堆

給定n個非負整數a 1 a 2 a n 對於每對 i,j 滿足1 i j n,得到乙個新的數a i xor a j 這樣共有n n 1 2個新的數。求這些數 不包含a i 中前k小的數。注 xor對應於pascal中的 xor c 中的 對於100 的資料,2 n 100000 1 k min 0 ...

BZOJ 3689 異或之 Trie樹 堆

題目鏈結 description 給定n個非負整數a 1 a 2 a n 對於每對 i,j 滿足1 i j n,得到乙個新的數a i xor a j 這樣共有n n 1 2個新的數。求這些數 不包含a i 中前k小的數。注 xor對應於pascal中的 xor c 中的 input 第一行2個正整數...

bzoj3689 異或之 trie 堆

好多種解法,自己yy了一種二分答案 trie的做法,不過貌似還是o nlog 2n 的,看了一下popoqqq大神的題解,發現可以用堆來做,先把每個位置的最小值放入堆裡,每次彈出乙個元素,假設這個元素是對應位置的第k小,那麼把對應位置的第k 1小放入堆中。乙個巧妙的處理,因為會重複,所以取2 k次,...