先排序,用单调栈维护id,ans=sum(x)+sum(y)
复杂度o(n)
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
int x,y,id;
}a[50005];
int n,x[50005],y[50005],t=0,st[50005];
bool cmp1(Node a,Node b)
{
return a.x>b.x;
}
bool cmp2(Node a,Node b)
{
return a.y>b.y;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) {
scanf("%d%d",&a[i].x,&a[i].y);
a[i].id=i;
}
sort(a,a+n,cmp1);
t=0;
for(int i=n-1;i>=0;i--) {
while(t>0&&a[st[t-1]].id<a[i].id) {
t--;
}
x[i] = t==0?i:st[t-1];
st[t++]=i;
}
long long ans=0;
for(int i=0;i<n;i++) {
if(x[i]!=i) {
a[i].x-=a[x[i]].x;
}
ans+=a[i].x;
}
t=0;
sort(a,a+n,cmp2);
for(int i=n-1;i>=0;i--) {
while(t>0&&a[st[t-1]].id<a[i].id) {
t--;
}
y[i]= t==0?i:st[t-1];
st[t++]=i;
}
for(int i=0;i<n;i++) {
if(y[i]!=i) {
a[i].y-=a[y[i]].y;
}
ans+=a[i].y;
}
printf("%lld\n",ans);
}