http://poj.org/problem?id=3016 (题目链接)

题意

  给出一个数列,将一个数${a_i}$更改为${b_i}$的代价为${|a_i-b_i|}$。求将数列改为不递减的最小代价

Solution

  话说我现在还没弄得明白→_→感觉论文的证明写的好搓。。

  左转题解:http://www.cnblogs.com/wenruo/p/5798801.html

代码

// poj3016
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 1<<30
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=2010;
struct heap {int l,r,val,sz;}q[maxn];
int num[maxn],rt[maxn],a[maxn],b[maxn],c[maxn];
int cnt,n,K,in[maxn][maxn],de[maxn][maxn],f[maxn][maxn]; int newq(int val) {
q[++cnt].val=val;
q[cnt].l=q[cnt].r=0;q[cnt].sz=1;
return cnt;
}
int merge(int x,int y) {
if (x==0 || y==0) return x+y;
if (q[x].val<q[y].val) swap(x,y);
q[x].r=merge(q[x].r,y);
swap(q[x].l,q[x].r);
q[x].sz=q[q[x].l].sz+q[q[x].r].sz+1;
return x;
}
int del(int x) {
int l=q[x].l,r=q[x].r;
return merge(l,r);
}
void cal(int *a,int u,int v,int *ans) {
int res=0,tot=0;cnt=0;
for (int i=u;i<=v;i++) {
rt[++tot]=newq(a[i]);
num[tot]=1;
while (tot>1 && q[rt[tot]].val<q[rt[tot-1]].val) {
tot--;
if (num[tot+1]&1) res+=q[rt[tot]].val-q[rt[tot+1]].val;
rt[tot]=merge(rt[tot],rt[tot+1]);
num[tot]+=num[tot+1];
while (q[rt[tot]].sz*2>num[tot]+1) rt[tot]=del(rt[tot]);
}
ans[i]=res;
}
}
int main() {
while (scanf("%d%d",&n,&K)!=EOF && n && K) {
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
c[i]=-a[i]-i;
b[i]=a[i]-i;
}
for (int i=1;i<=n;i++) {
cal(c,i,n,de[i]);
cal(b,i,n,in[i]);
}
for (int i=1;i<=n;i++) f[0][i]=inf;
for (int i=1;i<=K;i++) {
f[i][0]=0;
for (int j=1;j<=n;j++) {
f[i][j]=inf;
for (int k=0;k<j;k++)
f[i][j]=min(f[i][j],f[i-1][k]+min(in[k+1][j],de[k+1][j]));
}
}
printf("%d\n",f[K][n]);
}
return 0;
}

【poj3016】 K-Monotonic的更多相关文章

  1. 【BZOJ3110】K大数查询(整体二分)

    [BZOJ3110]K大数查询(整体二分) 题面 BZOJ 题解 看了很久整体二分 一直不知道哪里写错了 ... 又把树状数组当成线段树区间加法来用了.. 整体二分还是要想清楚在干什么: 我们考虑第\ ...

  2. 【CF1133E】K Balanced Teams(动态规划,单调队列)

    [CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...

  3. 【BZOJ4520】K远点对(KD-Tree)

    [BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...

  4. 【BZOJ4504】K个串 可持久化线段树+堆

    [BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...

  5. 机器学习【一】K最近邻算法

    K最近邻算法 KNN 基本原理 离哪个类近,就属于该类   [例如:与下方新元素距离最近的三个点中,2个深色,所以新元素分类为深色] K的含义就是最近邻的个数.在sklearn中,KNN的K值是通过n ...

  6. 【ZJOI2013】k大数查询 BZOJ 3110

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  7. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  8. BZOJ 3110 【Zjoi2013】 K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...

  9. 【BZOJ-4520】K远点对 KD-Tree + 堆

    4520: [Cqoi2016]K远点对 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 490  Solved: 237[Submit][Status ...

随机推荐

  1. 4.three.js中的坐标系

    Three.js中的坐标系 three.js中坐标系使用的是左手坐标系 左手坐标系和右手坐标系的对比: 当然three.js中使用的是右手坐标系 three.js中的旋转的定义 但是three.js中 ...

  2. IIS6/IIS7环境下实现支持mp4视频随意拖动、预览播放、边下载边播放

    前几天,一客户需要在IIS环境下实现MP4视频可以随意拖动观看,边下载边播放.一看这要求,IIS本身是无法实现,想着应该需要用插件,于是GG一番,还真找到这样的插件,此组件为H264-Streamin ...

  3. 纯命令行界面下安装并运行官方Android emulator

    纯命令行界面指没有安装Android studio. 下载sdk-tools 可以根据实际需要下载,不需要FQ(2018-04-07) 下载后只有一个tools目录. 平台 SDK 工具包 大小 SH ...

  4. Algorithm - 贪心算法使用场景 ( LEETCODE —— Best Time to Buy and Sell Stock II)

    先看一道leetcode题: Best Time to Buy and Sell Stock II Say you have an array for which the ith element is ...

  5. caffe 预训练 或者Fine-Tuning 操作

    1.使用预训练模型,需要修改训练的prototxt,将layer name改为与要使用模型的layer name相同即可. Borrowing Weights from a Pretrained Ne ...

  6. iOS 静态库 与 demo 联合调试

    在修复bug或者开发静态库需要调试,这个时候需要把工程中的.framework和资源bundle文件都替换为静态库原工程文件 首先需要确保静态库工程文件没有打开,Xcode不允许在两个地方同时打开同一 ...

  7. Redux和React-Redux的实现(三):中间件的原理和applyMiddleware、Thunk的实现

    现在我们的Redux和React-Redux已经基本实现了,在Redux中,触发一个action,reducer立即就能算出相应的state,如果我要过一会才让reducer计算state呢怎么办?也 ...

  8. 20145214《网络攻防》逆向及Bof基础实践

    20145214<网络攻防>逆向及Bof基础实践 实践说明 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...

  9. 《JavaScript》forEach()和map()

    js中的forEach()方法只能遍历数组,不能遍历字符串和对象,和$.each()有很多使用上的区别array.forEach(funcion(value,index,arr){},thisValu ...

  10. 网桥 以及 IEEE802.1D 生成树协议

    (一)网桥 网桥是一个layer 2设备,能够连接两个不同的网段. 如图