标签:yy
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1000100
using namespace std;
typedef long long ll;
int ch[N][2],key[N],size[N],root[N],h[N],L[N],R[N],w[N],num[N],a[N];
int n,m,x,tot,cnt;
void pushup(int x){size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}
int merge(int x,int y)
{
if(!x)return y;
if(!y)return x;
if(key[x]<key[y])swap(x,y);
ch[x][1]=merge(ch[x][1],y);
pushup(x);
if(h[ch[x][0]]<h[ch[x][1]])swap(ch[x][0],ch[x][1]);
if(!h[ch[x][1]])h[x]=0;
else h[x]=h[ch[x][1]]+1;
return x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]-=i;
for(int i=1;i<=n;i++)
{
root[++tot]=++cnt;
key[cnt]=a[i],size[cnt]=1;
num[tot]=1,L[tot]=R[tot]=i;
while(tot>1&&key[root[tot]]<key[root[tot-1]])
{
tot--;
root[tot]=merge(root[tot],root[tot+1]);
R[tot]=R[tot+1];
num[tot]+=num[tot+1];
while(size[root[tot]]>(num[tot]+1)/2)
{
root[tot]=merge(ch[root[tot]][0],ch[root[tot]][1]);
}
}
}
ll ans=0;
for(int i=1;i<=tot;i++)
{
for(int j=L[i];j<=R[i];j++)
{
ans+=abs(key[root[i]]-a[j]);
}
}
printf("%lld\n",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
BZOJ 1367 [Baltic2004]sequence 可并堆
标签:yy
原文地址:http://blog.csdn.net/wzq_qwq/article/details/47026849