题目链接

bzoj

洛谷

题解

第一问:

假如 \(i < j\)

如果 \(j\)能从\(i\)转移过来

显然中间空隙必须足够

例如:\(50\) \(53\) \(53\) \(52\)

就不能留下\(50\) 和 \(52\)

那么可以得到如果\(j\)能从\(i\)转移过来

满足

\(a[j]-a[i] >= j-i\)

\(=>\) \(a[j]-j >= a[i]-i\)

那么可以对于以上数列跑一边最长不下降子序列

第二问:

将原序列变为上升序列,就等于将新的序列(\(b_i = a_i-i\))变成不下降序列

那么对于最长不下降子序列相邻两点 \(c_{i-1},c_i\)

显然\(b\)序列上, 在这两点之间的点不会存在 \(c_{i-1}<=x<=c_i\)

可以证明,存在一个\(k\)点, 使得 在\(c_{i-1}\)和\(k\)点之间的点变成\(c_{i-1}\),剩下的点变成\(c_i\)时

代价最小

枚举\(k\),算出最小值即可

注意最长不下降子序列不只有一种,需要对于每一种都做一次

Code

#include<bits/stdc++.h>
#define MAX 35010
using namespace std;
inline int read() {
register int x=0,t=1;
register char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
struct Line {
int v,next;
}e[MAX<<2];
int h[MAX],cnt=1,n,H[MAX],Q[MAX],len;
inline void Add(int u,int v) {
e[cnt]=(Line){v,h[u]};
h[u]=cnt++;
}
int f[MAX];
long long g[MAX],sum1[MAX],sum2[MAX];
int main()
{
n=read();
for(int i=1;i<=n;++i)H[i]=read()-i;
H[++n]=1<<30;
for(int i=1;i<=n;++i) {
int l=1,r=len,ans=0;
while(l<=r) {
int mid=(l+r)>>1;
if(Q[mid]>H[i])r=mid-1,ans=mid;
else l=mid+1;
}
if(!ans)ans=++len;
Q[f[i]=ans]=H[i];
}
printf("%d\n",n-len);
for(int i=n;i>=0;--i)
g[i]=1e18,Add(f[i],i);
g[0]=0;H[0]=-H[n];
for(int i=1;i<=n;++i) {
for(int E=h[f[i]-1];E;E=e[E].next) {
int v=e[E].v;
if(v>i)break;
if(H[v]>H[i])continue;
for(int j=v;j<=i;++j) {
sum1[j]=sum1[j-1]+abs(H[j]-H[v]);
sum2[j]=sum2[j-1]+abs(H[i]-H[j]);
}
for(int j=v;j<i;++j)
g[i]=min(g[i],g[v]+sum1[j]-sum1[v]+sum2[i]-sum2[j]);
}
}
printf("%lld\n",g[n]);
return 0;
}

洛谷P2501 bzoj1049 [HAOI2006]数字序列的更多相关文章

  1. 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]

    题目传送门 数字序列 题目描述 给定一个整数序列 a1​,a2​,⋅⋅⋅,an​ ,求出一个递增序列 b1​<b2​<⋅⋅⋅<bn​ ,使得序列 ai​ 和 bi​ 的各项之差的绝对 ...

  2. 【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS

    很有(\(bu\))质(\(hui\))量(\(xie\))的一个题目. 第一问:求最少改变几个数能把一个随机序列变成单调上升序列. \(Solution:\)似乎是一个结论?如果两个数\(A_i\) ...

  3. BZOJ1049 [HAOI2006]数字序列0

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  4. BZOJ1049:[HAOI2006]数字序列(DP)

    Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列. 但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个 ...

  5. 洛谷P4331 [BOI2004]Sequence 数字序列(左偏树)

    传送门 感觉……不是很看得懂题解在说什么? 我们先把原数列$a_i-=i$,那么本来要求递增序列,现在只需要求一个非严格递增的就行了(可以看做最后每个$b_i+=i$,那么非严格递增会变为递增) 如果 ...

  6. 洛谷$P4331\ [BOI2004]\ Sequence$ 数字序列 左偏树

    正解:左偏树 解题报告: 传送门$QwQ$ 开始看到的时候$jio$得长得很像之前做的一个$dp$,,, 但是$dp$那题是说不严格这里是严格? 不难想到我们可以让$a_{i},b_{i}$同时减去$ ...

  7. BZOJ1049: [HAOI2006]数字序列

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题解: ydc的题解:http://pan.baidu.com/share/link?u ...

  8. 【BZOJ1049】 [HAOI2006]数字序列

    BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...

  9. 洛谷 P2501 [HAOI2006]数字序列 解题报告

    P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...

随机推荐

  1. 【bzoj1834】[ZJOI2010]network 网络扩容

    1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2701  Solved: 1368[Submit ...

  2. Docker学习笔记_安装ActiveMQ

    一.实验环境 1.宿主机OS:Win10 64位 2.虚拟机OS:Ubuntu18.04,虚拟机名称:Ubuntu18VM1,虚拟机IP:192.168.8.25 3.操作账号 :Docker 4.在 ...

  3. xgboost 并行调参

    Parallelism When Cross Validating XGBoost Models This raises the question as to how cross validation ...

  4. PHP+SOCKET 模拟HTTP请求

    HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: ...

  5. Smarty3——内置函数

    Table of Content {$var} {$append} {assign} {block} {call} {config_load} {debug} {extends} {for} {for ...

  6. SpringMVC——概述

    Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 Spring MV ...

  7. keydown、input 和 keyup 事件

    keydown.keyup 属于键盘事件,input 属于文本事件. keydown:当用户按下键盘上的任意按键时触发,如果按住不放,会重复触发此事件. keyup:当用户释放键盘上的按键时触发. i ...

  8. dynamic和nullable一起使用时的注意

    dynamic和nullable一起使用时的注意

  9. [原创]Java中使用File类的list方法获取一定数量的文件:FilenameFilter接口的特殊用法

    前言:有时候我们可能会遇到这样一个问题:需要遍历一个包含极多文件的文件夹,首先想到的肯定是使用File.list()方法,该方法返回一个String[],但是如果文件达到几亿呢?这个时候我们就需要分批 ...

  10. JAVA的IO处理【转】

    I/O简介 IO是输入和输出的简称,在实际的使用时,输入和输出是有方向的.就像现实中两个人之间借钱一样,例如A借钱给B,相对于A来说是借出,而相对于B来说则是借入.所以在程序中提到输入和输出时,也需要 ...