题目链接:Kisik
显然我们最后矩形的高度一定是物品的某一个高度。
然后我们可以枚举高度然后选k个最小的宽度,排序后用堆维护k个最小值即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,k,res=1e18,sum; priority_queue<int> q;
pair<int,int> a[N];
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read(){
int x=0,f=1; char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
signed main(){
n=read(),k=read();
for(int i=1;i<=n;i++) a[i].second=read(),a[i].first=read();
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(q.size()<k) q.push(a[i].second),sum+=a[i].second;
else if(q.top()>a[i].second)
sum-=q.top()-a[i].second,q.pop(),q.push(a[i].second);
if(q.size()==k) res=min(res,sum*a[i].first);
}
cout<<res;
return 0;
}