【数据结构 堆】luogu_4597 序列sequence
作者:互联网
题意
给定一个序列,每次操作可以把某个数+1-1。要求把序列变成非降数列。而且要求修改后的数列只能出现修改前的数。
思路
当前的数为x,之前的最大值为y,为了满足非降,我们要在[x,y]找到一个值z,让x和y变成z,无论z是什么,代价都为y−x,但选的更小更容易满足非降,所以我们改成x。
那么y改成x后,y之前有最大值z>y怎么办,其实在后面z也会降下来,不会对答案造成影响。
代码
#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