萌新蒟蒻求助,用权值线段树0分
查看原帖
萌新蒟蒻求助,用权值线段树0分
313736
Lemon_X楼主2021/11/27 14:18

RT,但是本地样例能过

球球了QwQ

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int n,sum[N*4],a,ans,cnt,zans;
void update(int o,int l,int r,int k,int v){
    if(l==r){
        sum[o]+=v;
        return;
    }
    int mid=l+r>>1;
    if(k<=mid)update(o*2,l,mid,k,v);
    else update(o*2+1,mid+1,r,k,v);
    sum[o]=sum[o*2]+sum[o*2+1];
}
int query(int o,int l,int r,int x,int y){
    if(y<l||x>r)return 0;
    if(x<=l&&r<=y)return sum[o];
    int mid=l+r>>1;
    return query(o*2,l,mid,x,y)+query(o*2+1,mid+1,r,x,y);
}
int query2(int o,int l,int r,int k){
    if(l==r)return sum[o];
    int mid=l+r>>1;
    if(k<=mid)return query2(o*2,l,mid,k);
    else return query2(o*2+1,mid+1,r,k);
}
int findkth(int o,int l,int r,int k){
    if(l==r)return r;
    int mid=l+r>>1;
    if(k<=sum[o*2])findkth(o*2,l,mid,k);
    else findkth(o*2+1,mid+1,r,k-sum[o*2]);
}
int getpre(int x,int n){
    int k=query(1,1,N,1,x-1);
    if(k==0)return -1;
    return findkth(1,1,N,k);
}
int getnext(int x,int n){
    int k=query(1,1,N,1,x)+1;
    if(k==n)return -1;
    return findkth(1,1,N,k);
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a);
        if(i==1) printf("%d\n",a),zans=a;
        else{
            ans=0;
            if(query2(1,1,N,a)==0){
                int x=getpre(a,i),y=getnext(a,i);
                if(x==-1)ans=y-a;
                else if(y==-1)ans=a-x;
				else ans=min(a-x,y-a);
            }
            zans+=ans;
        }
        update(1,1,N,a,1);
    }
    cout<<zans;
}
2021/11/27 14:18
加载中...