abc 376E
作者:
Air1222
,
2024-10-23 20:19:45
,
所有人可见
,
阅读 3
//题目描述:给定序列a,b,查找k个坐标,满足a中的最大值*b中k个坐标的和最小
//发现有两维变量,可以固定住一维
//用pair绑定a,b的坐标
//因为要找a的最大值,我们可以对a排序
//题目转化为,如何快速求小于当前a坐标的b序列的k个最小b和
//暴力O(n^2) TLE
//正确做法,用优先队列,因为我们选取的坐标一定是小于当前的i的
//维护优先队列的数量为k即可
#include <iostream>
#include <algorithm>
#include <queue>
#define x first
#define y second
using namespace std;
const int N = 2e5+10;
typedef pair<int,int>PII;
typedef long long LL;
PII a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i].x;
for(int i=1;i<=n;i++) cin>>a[i].y;
sort(a+1,a+1+n);
priority_queue<int>q;
LL sum=0;
for(int i=1;i<=k;i++)
{
q.push(a[i].y);
sum+=a[i].y;
}
LL ans=sum*a[k].x;
for(int i=k+1;i<=n;i++)
{
sum+=a[i].y;
q.push(a[i].y);
sum-=q.top();
q.pop();
ans=min(ans,sum*a[i].x);
}
cout<<ans<<endl;
}
return 0;
}