考虑我们直接选择一个暴力(dp)。
(f_{i,j} = min_{k<=j} (f_{i - 1,k}) + |a_i - j|)
我们考虑到我们直接维护在整个数域上(min(f_{i,j})),且以(i)为时间维,(j)为变量。
我们思考我们用队列每次维护这个函数的凸壳转移点即可。
建议脑子里构思出函数图像来整理。
凸壳证明暂且不提。
#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);
q.push(x);
if(x<q.top()){
ans+=q.top()-x;
q.pop(),q.push(x);
}
}
printf("%lld
",ans);
return 0;
}