其他分享
首页 > 其他分享> > 【数据结构 堆】luogu_4597 序列sequence

【数据结构 堆】luogu_4597 序列sequence

作者:互联网

题意

给定一个序列,每次操作可以把某个数+1-1。要求把序列变成非降数列。而且要求修改后的数列只能出现修改前的数。

思路

当前的数为xxx,之前的最大值为yyy,为了满足非降,我们要在[x,y][x,y][x,y]找到一个值zzz,让xxx和yyy变成zzz,无论zzz是什么,代价都为yxy-xy−x,但选的更小更容易满足非降,所以我们改成xxx。

那么yyy改成xxx后,yyy之前有最大值z>yz>yz>y怎么办,其实在后面zzz也会降下来,不会对答案造成影响。

代码

#include<queue>
#include<cstdio>

std::priority_queue<int> q;
int n;
long long ans;
int main(){
    scanf("%d", &n);
    int x;
    for (; n; n--){
        scanf("%d", &x);
		q.push(x);
        if(x < q.top()){
            ans += q.top() - x;
            q.pop();
			q.push(x);
        }
    }
    printf("%lld", ans);
}

标签:zzz,sequence,int,luogu,xxx,yyy,4597,ans,非降
来源: https://blog.csdn.net/SSL_hzb/article/details/95004351