p1801 黑匣子
給你一堆數,每次讓你求前多少個數中的第 \(k\) 小的數。
大根堆 +小根堆。
沒有詢問前把數都加到大根堆裡,有詢問的時候當大根堆裡的元素不少於 \(k\) 的時候就把堆頂的元素放到小跟堆裡,最後小根堆堆頂的元素就是答案,最後要把小根堆堆頂的元素放回大根堆中。
#include #include #include #include #include #include #define maxn 200001
int n, m, a[maxn], b[maxn];
std::priority_queueq1;
std::priority_queue, std::greater> q2;
int main()
int ans = q2.top();
q1.push(ans), q2.pop();
printf("%d\n", ans);
++now;}}
return 0;
}
洛谷P1801 黑匣子
題目傳送門 分析 這題和另外乙個題目中位數非常相似,有興趣可以先看看,比這一題簡單。首先暴力模擬還是別想了,估計30 的資料都有點懸。正解應該是用二叉堆。但是如果用乙個堆當然不方便,所以建兩個堆,乙個大根堆,乙個小根堆,每次只要出現詢問操作,就把小根堆的堆頂丟進大根堆中維護,然後輸出就可以了,但是要...
洛谷P1801 黑匣子
題目鏈結 看到題解中 維護兩個堆 突然想到了這道題的解法 維護兩個堆 大根堆h1,小根堆h2 大根堆裡的是最小的i個值,小根堆裡是剩下的值 每add乙個值時 插入到小根堆中,再比較小根堆的最小值與大根堆的最大值 若h2.top 將兩個元素取出,換一下再放進去 需要get時 將h2.top 取出,放進...
洛谷P1801 黑匣子
long long就果然還是就該用cout,沒有lld的ll留下了悔恨的眼淚 鏈結一放,要看什麼對頂堆的走開走開,我只會離散化加權值樹狀陣列 首先吧,這個詢問依次遞增就友善的一批,然後詢問某刻第k位,我們用權值樹狀陣列。首先如果i有,那麼在陣列中下標為i的位置就打成1,沒有就是0,樹狀陣列裡面存的是...