P2234 营业额统计 题解
HxDlBbCo877 · · 题解
题意简述
设
对于绝对值,尝试分类讨论。
现在考虑怎么维护比第
这是一个很二维偏序的式子(
复杂度
#include <iostream>
using namespace std;
const int N=32768;
const int INF=1<<30;
inline int read()
{
int x=0;bool w=0;char ch=0;
while(ch<'0'|ch>'9'){w|=(ch=='-');ch=getchar();}
while(ch>='0'&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return w?-x:x;
}
struct cdq{int x,tag;}p[N],q[N],tmp[N];int ans[N];
void solve(int l,int r,cdq*a)
{
if(l==r)return;int i=l,m=l+r>>1,j=m+1,tot=l,maxn=-INF;solve(l,m,a);solve(m+1,r,a);
while(i<=m&j<=r)
{
if(a[i].x<=a[j].x)maxn=a[i].x,tmp[tot++]=a[i++];
else ans[a[j].tag]=min(ans[a[j].tag],a[j].x-maxn),tmp[tot++]=a[j++];
}
while(i<=m)tmp[tot++]=a[i++];
while(j<=r)ans[a[j].tag]=min(ans[a[j].tag],a[j].x-maxn),tmp[tot++]=a[j++];
for(i=l;i<=r;i++)a[i]=tmp[i];
}
int main()
{
int n=read(),sum=0;
for(int i=1;i<=n;i++)ans[i]=INF,p[i].tag=q[i].tag=i,p[i].x=read(),q[i].x=-p[i].x;
ans[1]=p[1].x;
solve(1,n,p);solve(1,n,q);
for(int i=1;i<=n;i++)sum+=ans[i];
cout<<sum;
return 0;
}