关闭

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

495人阅读 评论(5) 收藏 举报
分类:

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

看这里
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;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:306786次
    • 积分:12378
    • 等级:
    • 排名:第1310名
    • 原创:969篇
    • 转载:3篇
    • 译文:0篇
    • 评论:54条
    最新评论