【poj3016】 K-Monotonic
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的更多相关文章
- 【BZOJ3110】K大数查询(整体二分)
[BZOJ3110]K大数查询(整体二分) 题面 BZOJ 题解 看了很久整体二分 一直不知道哪里写错了 ... 又把树状数组当成线段树区间加法来用了.. 整体二分还是要想清楚在干什么: 我们考虑第\ ...
- 【CF1133E】K Balanced Teams(动态规划,单调队列)
[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...
- 【BZOJ4520】K远点对(KD-Tree)
[BZOJ4520]K远点对(KD-Tree) 题面 BZOJ 洛谷 题解 考虑暴力. 维护一个大小为\(K\)的小根堆,然后每次把两个点之间的距离插进去,然后弹出堆顶 这样子可以用\(KD-Tree ...
- 【BZOJ4504】K个串 可持久化线段树+堆
[BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...
- 机器学习【一】K最近邻算法
K最近邻算法 KNN 基本原理 离哪个类近,就属于该类 [例如:与下方新元素距离最近的三个点中,2个深色,所以新元素分类为深色] K的含义就是最近邻的个数.在sklearn中,KNN的K值是通过n ...
- 【ZJOI2013】k大数查询 BZOJ 3110
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- 【BZOJ-3110】K大数查询 整体二分 + 线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6265 Solved: 2060[Submit][Sta ...
- BZOJ 3110 【Zjoi2013】 K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...
- 【BZOJ-4520】K远点对 KD-Tree + 堆
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 490 Solved: 237[Submit][Status ...
随机推荐
- 我看微软收购GitHub
今天是微软收购GitHub的第三天,之前很多人担心被微软收购的GitHub会步Skype,诺基亚等企业的后尘,凡此种种我觉得更多人的担心是:GitHub不再开源免费罢了. GitHub今年4月刚成立十 ...
- SICP读书笔记 3.1
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- KClient——kafka消息中间件源码解读
目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.K ...
- 配置tensorflow环境(anaconda+jupyter notebook)
很早之前,tensorflow环境之前我也曾装过,但是用的不是很舒服,很多问题都不明所以然.今天想要系统地学习一下tensorflow,于是又重新搭建了一遍,这次还是踩了不少坑.特此写下此文,供有兴趣 ...
- tac命令详解
基础命令学习目录首页 原文链接:http://blog.chinaunix.net/uid-128922-id-289974.html 有许多命令都可以查看文件,不同的命令有不同的优点,可以针对不同的 ...
- Vue 入门之概念
Vue 简介 Vue 是一个前端的双向绑定类的框架,发音[读音 /vjuː/, 类似于 [view].新的 Vue 版本参考了 React 的部分设计,当然也有自己独特的地方,比如 Vue 的单文件组 ...
- PHP中的文件包含
在PHP中,包含文件有两种方式:include和require.这两种方式的功能一样,只有一个区别,就是使用require包含一个文件时,如果出现错误,脚本不会继续执行:而如果使用include包含, ...
- Scrum Meeting 11.04
成员 今日任务 明日计划 用时 徐越 学习Fragment相关知识,代码移植 代码移植 4h 赵庶宏 selvet移植,服务器配置,编写数据库 服务器配置,代码移植 4h 薄霖 学习安卓界面设计数据库 ...
- grunt入门讲解5:创建插件,安装Grunt以及常见问题
创建插件 创建插件主要有以下几个步骤: (1)通过 npm install -g grunt-init 命令安装 grunt-init .(2)通过 git clone git://github.co ...
- vue组件讲解(is属性的用法)
什么是组件? 在说之前我们先搞清楚什么是组件?这样对我们下边的学习是很有帮助的. 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可以重复使用的代码.在较高层次 ...