洛谷P1801 黑匣子 堆

2022-09-01 10:00:13 字數 577 閱讀 4156

兩種操作:

有點像對頂堆啊。

每次維護乙個大根堆,保證只儲存最小的s

s個數字。其中s

s表示現在進行了ss次g

etge

t操作。

然後維護乙個小根堆,把其他所有數字儲存進去。這樣每次詢問完就可以把不在大根堆裡的最小的元素扔進大根堆裡。方便下一次詢問。

時間複雜度o(m

log⁡n)

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 取出,放進...