ABC E WA*18 求调
  • 板块学术版
  • 楼主xsmfollower
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/19 21:48
  • 上次更新2024/10/19 21:53:42
查看原帖
ABC E WA*18 求调
1308728
xsmfollower楼主2024/10/19 21:48
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N=2e5+10;
struct P { int a,b; }a[N];
void solve() {
  int n,k; scanf("%d %d",&n,&k);
  for(int i=1;i<=n;i++) scanf("%d",&a[i].a);
  for(int i=1;i<=n;i++) scanf("%d",&a[i].b);
  sort(a+1,a+n+1,[](P a,P b) { return a.a<b.a; });
  //for(int i=1;i<=n;i++) printf("%d:%d %d\n",i,a[i].a,a[i].b);
  long long sum=0; priority_queue<int>q;
  for(int i=1;i<=k;i++) sum+=a[i].b,q.push(a[i].b);
  long long ans=a[k].a*sum;
  for(int i=k+1;i<=n;i++) {
    //printf("%lld\n",ans);
  	long long sum2=a[i].a*(sum-(a[i].b>q.top()?a[i].b:q.top())+a[i].b);
  	if(sum2<ans) ans=sum2,sum-=(a[i].b>q.top()?a[i].b:q.top()),sum+=a[i].b,q.pop(),q.push(a[i].b);
  }
  printf("%lld\n",ans);
}
int main() {
  int t; scanf("%d",&t);
  while(t--) solve();
  return 0;
}
2024/10/19 21:48
加载中...