CF713C Sonya and Problem Wihtout a Legend
考虑我们直接选择一个暴力\(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\n",ans);
return 0;
}