好多種解法,自己yy了一種二分答案+trie的做法,不過貌似還是o(nlog^2n)的,看了一下popoqqq大神的題解,發現可以用堆來做,先把每個位置的最小值放入堆裡,每次彈出乙個元素,假設這個元素是對應位置的第k小,那麼把對應位置的第k+1小放入堆中。
乙個巧妙的處理,因為會重複,所以取2*k次,只取奇數次的就可以了。
一開始要考慮自己的問題,所以每個位置的第二小值放入堆中。
#include#include#include#include#include#include#include#define maxn 4000010
using namespace std;
int ch[maxn][2],size[maxn];
int a[maxn];
int tot,n,m,k,mx;
struct yts
;struct cmp
};priority_queue,cmp> p;
void insert(int t)
return ans;
}int main()
for (int i=1;i<=n;i++) insert(a[i]);
for (int i=1;i<=n;i++)
for (int i=1;i<=2*k;i++)
printf("\n");
return 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個正整數...
bzoj 3689 異或之 字典樹 堆
給定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 先對所有數建一棵字典樹,對字典樹的每個節點記錄這個節點...
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 ...