题解
1.选k个数,就会有k-1个数没法选。我们可以倒着来,每少选一个数,就会多一个数可以选,添加总比删除简单
2.最小的那个数,也就是第k小的数,因此我们可以维护一个大小为k 的优先队列,最小值就是队首元素
code
#define ll long long
#include<bits/stdc++.h>
using namespace std;
ll a[200008],p[200005]={0};
int main()
{
ios::sync_with_stdio(false);
ll t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
priority_queue<ll ,vector<ll>,greater<ll> > mins;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
}
for(ll i=1;i<=n;i++)
{
cin>>p[i];
}
ll ans=0,cnt;
for(ll i=n;i>=1;i--)
{
mins.push(a[p[i]]);
while(mins.size()>i) mins.pop();//维护
if(mins.size()>=i && mins.top()*i>=ans)//尽可能少选
{
ans=mins.top()*i;
cnt=i;
}
}
cout<<ans<<" "<<cnt<<endl;
}
return 0;
}
标签:ll,Mushrooms,Kirill,ans,mins,top,size
From: https://www.cnblogs.com/pure4knowledge/p/18102661