首先按小到大排序,考慮列舉兩個都喜歡的個數\(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 中的任何乙個元素。那麼假設高度為權值,...