https://codeforces.com/group/NVaJtLaLjS/contest/253990/attachments
代码里堆的那部分主要作用是:B可以把前面取的换成后面取,但不可以把后面的换成前面的。
#include<bits/stdc++.h>
using namespace std;
int n;
priority_queue<int,vector<int>,greater<int> > pq;
struct node{
int a,b;
bool operator < (node x){
if(a!=x.a)return a>x.a;
return b>x.b;
}
}a[100000+100];
int main()
{
//freopen("input.in","r",stdin);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].a;
for(int i=1;i<=n;i++)cin>>a[i].b;
sort(a+1,a+1+n);
for(int i=2;i<=n;i+=2)
{
pq.push(a[i].b);
int x=pq.top();
if(x<a[i+1].b)pq.pop(),pq.push(a[i+1].b);
}
long long ans=0;
while(!pq.empty())ans+=pq.top(),pq.pop();
cout<<ans<<endl;
return 0;
}