hihocoder Challenge 29 D. 不上升序列

来源:互联网 发布:php开源在线教育系统 编辑:程序博客网 时间:2024/06/04 19:34

这场爆零比赛题目还是要补的

这道题据说是出烂掉的原题,我找了下

CF13.C/ CF371 div1 C,一模一样 我服这群原题大佬

Fi[x]为 当A[i]<=x时,使A[1i] 不严格递增的最小步数,那么

i==1 Fi[x]=minxy=1|A[i]y|

Otherwise Fi[x]=minxy=1(Fi1[y]+|A[i]y|)

显然Fi[x]是不严格单调递减的曲线

那么我令 OPTi=Fi[x]OPTi有个重要的信息,就是斜率是递增的x0

ChangeiOPTi的斜率变为0时的拐点对应 x 大小, 则分类讨论

Changei1<=A[i],那么必在A[i]达到理想状态,和OPTi1结合为OPTi鞋履更陡,

Changei1>A[i],那么x<=A[i]斜率递减,x>A[i]会在一个地方达到交点,必是Changei1,那个就是最优点

好吧我还是不太理解,我尽力了,发一下链接,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|1const 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;}