传送门
题解:
很显然的费用流模型,考虑将所有点拿来按照 a i a_i ai和 b i b_i bi排序后贪心进行匹配。
然后把负的代价退掉即可。
堆维护一下贪心即可。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
using std::cerr;
using std::cout;
cs int N=2e5+7;
int n,m;
int w[N];
ll ans,sum;
std::priority_queue<int> q;
std::priority_queue<int,std::vector<int>,std::greater<int> > p;
struct node{int x,y,t;}a[N];
signed main(){
#ifdef zxyoi
freopen("jump.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
for(int re i=1;i<=n;++i)scanf("%d",&a[i].x);
for(int re i=n+1;i<=n+m;++i){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].t=1,a[i].y-=a[i].x;
}
std::sort(a+1,a+n+m+1,[](cs node &a,cs node &b){
return a.x==b.x?a.t<b.t:a.x<b.x;
});
int hd=1,tl=0;
for(int re i=1;i<=n+m;++i){
if(a[i].t)q.push(a[i].y);
else if(!q.empty()){
int t=q.top();q.pop();
sum+=a[i].x+t;p.push(t);
w[++tl]=a[i].x;
}
else {
if(hd<=tl){
sum+=a[i].x-w[hd++];
w[++tl]=a[i].x;
}
}
}
ans=sum;
for(int re i=hd;i<=tl;++i){
sum-=p.top()+w[i];p.pop();
ans=std::max(ans,sum);
}
cout<<ans<<"\n";
return 0;
}