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;
}
posted @ 2021-08-17 16:45  fhq_treap  阅读(80)  评论(0编辑  收藏  举报