题目大意
题目大意:给出你一个N,会给你3*N个数,然后让你删去N个数,保证其中的前N个数,和后N个数的差值是最大的。
思路:首先对于这个题目,我们知道这个题目的最终界限一定在n~2*n这个范围内,那么我们不妨用两个优先队列把前面的N个数给存储起来,也把后面的N个数都储存起来,如果我们在n+1~2*n中遇到了比保存前面的值更大的值,那么我们就可以进行替换,后面的也是一样的,
不过要注意的是,单纯的替换是不可行的,在这里,我们可以用一个pre和suf数组,然后保存一下取得某个合适值的位置,然后我们一个从前面开始找大的,一个从后面开始找小的,那么我们到最后只需要进行pre和suf的对应位置的差就可以表示了
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int maxn=1e5+10;
priority_queue<ll, vector<ll>, greater<ll> >Qpre;
priority_queue<ll>Qsuf;
ll pre[maxn*3];
ll suf[maxn*3];
ll a[maxn*3];
int n;
int main()
{
scanf("%d",&n);
ll sump=0,sumf=0;
for(int i=1;i<=3*n;i++)
{
scanf("%lld",&a[i]);
if(i<=n)sump+=a[i],Qpre.push(a[i]);
if(i>2*n) sumf+=a[i],Qsuf.push(a[i]);
}
pre[n]=sump;
for(int i=n+1;i<=2*n;i++)
{
if(a[i]>Qpre.top())
{
sump=sump+a[i]-Qpre.top();
Qpre.pop();
Qpre.push(a[i]);
}
pre[i]=sump;
}
suf[2*n]=sumf;
for(int i=2*n-1;i>=n;i--)
{
if(Qsuf.top()>a[i+1])
{
sumf=sumf-Qsuf.top()+a[i+1];
Qsuf.pop();
Qsuf.push(a[i+1]);
}
suf[i]=sumf;
}
ll ans=pre[n]-suf[n];
for(int i=n+1;i<=2*n;i++)
{
ans=max(ans,pre[i]-suf[i]);
}
printf("%lld\n",ans);
}