这场爆零比赛题目还是要补的
这道题据说是出烂掉的原题,我找了下
CF13.C/ CF371 div1 C,一模一样 我服这群原题大佬
Fi[x] 为 当 A[i]<=x 时,使 A[1∼i] 不严格递增的最小步数,那么
i==1 Fi[x]=minxy=1|A[i]−y|
Otherwise Fi[x]=minxy=1(Fi−1[y]+|A[i]−y|)
显然 Fi[x] 是不严格单调递减的曲线
那么我令 OPTi=Fi[x] , OPTi 有个重要的信息,就是斜率是递增的 −x→0
Changei 为 OPTi 的斜率变为0时的拐点对应 x 大小, 则分类讨论
Changei−1<=A[i] ,那么必在 A[i] 达到理想状态,和 OPTi−1 结合为 OPTi 鞋履更陡,Changei−1>A[i] ,那么 x<=A[i] 斜率递减, x>A[i] 会在一个地方达到交点,必是 Changei−1 ,那个就是最优点
好吧我还是不太理解,我尽力了,发一下链接,CF371 div1C comment
#include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <algorithm> #include <iostream> #include <map> #include <set> #include <queue> #include <cmath> using namespace std; typedef long long ll; #define lson l,m, rt<<1 #define rson m+1, r, rt<<1|1 const int N = 2e5+5; const int INF = 0x3f3f3f3f; int main() { int n; while(~scanf("%d", &n) ) { priority_queue<int> Q; int ans = 0; for(int i = 0; i < n; ++i) { int a; scanf("%d", &a); a = -a; Q.push(a); if(Q.top() != a) { ans += Q.top() - a; Q.pop(); Q.push(a); } } printf("%d\n", ans); } return 0; }