兩種操作:
有點像對頂堆啊。
每次維護乙個大根堆,保證只儲存最小的s
s個數字。其中s
s表示現在進行了ss次g
etge
t操作。
然後維護乙個小根堆,把其他所有數字儲存進去。這樣每次詢問完就可以把不在大根堆裡的最小的元素扔進大根堆裡。方便下一次詢問。
時間複雜度o(m
logn)
o(mlogn)
#include
#include
using
namespace std;
const
int n=
200010
;int n,m,s,add[n]
,cnt[n]
;priority_queue<
int> q1,q2;
intmain()
for(
int i=
1;i<=n;i++
)for
(;cnt[i]
;cnt[i]--)
}return0;
}
洛谷P1801 黑匣子 堆
兩種操作 有點像對頂堆啊。每次維護乙個大根堆,保證只儲存最小的s ss個數字。其中s ss表示現在進行了s ss次get getge t操作。然後維護乙個小根堆,把其他所有數字儲存進去。這樣每次詢問完就可以把不在大根堆裡的最小的元素扔進大根堆裡。方便下一次詢問。時間複雜度o m log n o m ...
洛谷P1801 黑匣子
題目傳送門 分析 這題和另外乙個題目中位數非常相似,有興趣可以先看看,比這一題簡單。首先暴力模擬還是別想了,估計30 的資料都有點懸。正解應該是用二叉堆。但是如果用乙個堆當然不方便,所以建兩個堆,乙個大根堆,乙個小根堆,每次只要出現詢問操作,就把小根堆的堆頂丟進大根堆中維護,然後輸出就可以了,但是要...
洛谷P1801 黑匣子
題目鏈結 看到題解中 維護兩個堆 突然想到了這道題的解法 維護兩個堆 大根堆h1,小根堆h2 大根堆裡的是最小的i個值,小根堆裡是剩下的值 每add乙個值時 插入到小根堆中,再比較小根堆的最小值與大根堆的最大值 若h2.top 將兩個元素取出,換一下再放進去 需要get時 將h2.top 取出,放進...