對頂堆 nssl 1477 賽

2022-06-12 22:30:16 字數 727 閱讀 7773

首先按小到大排序,考慮列舉兩個都喜歡的個數\(i\)

那麼只喜歡乙個的個數各需要\(k-i\),剩下要補充到\(m-k*2+i\)個,

考慮用對頂堆維護大根堆大小僅有\(m-k*2+i\)即可

#include #include #include #define rr register

using namespace std;

const int n=200011; typedef long long lll; lll ans=1e18,sum;

int n1,n2,n3,like[n],a[n],b[n],c[n],n,m,k,o[n];

inline signed iut()

inline lll min(lll a,lll b)

} inline void pop()

}}heap1;

struct min_heap

} inline void pop()

if (!len) ans=min(ans,sum);

} sum+=c[i+1];

} if (ans==1e18) printf("-1");

else printf("%lld",ans);

return 0;

}

nssl1477 賽 對頂堆,貪心

n nn個物品,有兩個人,每個人有一些喜歡的物品。選m mm個物品,至少選擇k kk個第乙個人喜歡的和k kk個第二個人喜歡的物品 首先我們必定是選最小的 我們從小到大列舉選擇多少兩個人都喜歡的物品i ii,然後每人選擇k x k xk x只有這個人喜歡的物品,之後我們將剩下的物品丟進乙個資料結構裡...

對頂堆的故事

總結 用大頂堆和小頂堆來實現,控制兩個堆的個數來實現將第幾個數暴露在兩個堆的中間,這樣就可以隨時輸出第幾個數,隨意以乙個頂堆的top 為標準,判斷下乙個數加在哪個堆裡,並時刻控制數量,這樣就可以將要求的第幾個數一直存疑兩個頂堆的top 之間。include include using namespa...

對頂堆學習筆記

處理動態中位數等問題,靈活運用了堆的性質,本質是維護兩個堆。大根堆 q 1 維護集合中較小值的部分的最大值。小根堆 q 2 維護集合中較大值的部分的最小值。注意到兩個堆中的元素各自是單調的,兩個堆間也是單調的。也就是說,q 1 中的任何乙個元素都不大於 q 2 中的任何乙個元素。那麼假設高度為權值,...