题解 CF713C 【Sonya and Problem Wihtout a Legend】
题意
- 给定一个长为
n 的序列a ,可以进行若干次操作使得某个数减一或加一,求使序列严格递增的操作数; -
[题目链接](https://www.luogu.com.cn/problem/CF713C)
更好的阅读体验
四倍经验:(前三题为使得序列非严格递增)
P4597 序列sequence
CF13C Sequence
P2893 [USACO08FEB]Making the Grade G
CF713C Sonya and Problem Wihtout a Legend
分析
首先有一个套路的想法,将
转化之后,我们考虑如何求解。
考虑下面一种想法(主要是我想不到怎么正向考虑这种诡异的想法,只能强行说明这个做法的正确性):
我们边维护序列边用优先队列维护当前修改过的序列的最大值,每当我们得到一个数
我们考虑任意一种调整方法,发现对于逆序对
然后考虑一个问题:如果
我们构造到最后,这个
我们定义“微调”为不改变花费的情况下,改变某个数对的值。
如果
如果
时间复杂度:
代码
#include<stdio.h>
#include<queue>
using namespace std;
int n;
long long ans;
priority_queue<int>q;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
x-=i,q.push(x);
if(x<q.top()){
ans+=q.top()-x;
q.pop(),q.push(x);
}
}
printf("%lld\n",ans);
return 0;
}