雯舞

Love three things int he world -- Manchery

[堆] hihoCoder Challenge 29 D. 不上升序列

出烂了的原题,有可并堆的做法
然而昨晚翻原题的时候发现了精妙的做法

看这里
fi(x)为前i个数,调整出最大值不超过x的最小代价
那么fi是一条不升的折线
考虑转移 fi(x)=minyxfi1(y)+|aiy|
这实际上是两条折线合并一下 我们讨论两者的位置关系
实现的话只需要在堆中记下所有的折点

来自链接中的图片
这里写图片描述

#include <iostream>
#include<cstdio>
#include<queue>
using namespace std;
long long c,n,i,k;
priority_queue<int>a;
int main(){
  freopen("t.in","r",stdin);
  freopen("t.out","w",stdout);
  cin>>n;
  for(i=0;i<n;i++){
    cin>>c; c=-c;
    a.push(c);
    if(a.top()>c){k+=a.top()-c;a.pop();a.push(c);
    }
  }
  cout<<k;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许随意转载。 https://blog.csdn.net/u014609452/article/details/73740861
个人分类:
上一篇[二幂拆分] hihoCoder Challenge 29 B. 快速乘法 &amp; BZOJ 1111[POI2007]四进制的天平Wag
下一篇[霍尔定理] AtCoder Regular Contest 076 F Exhausted?
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭