洛谷P2501 bzoj1049 [HAOI2006]数字序列
题目链接
题解
第一问:
假如 \(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]数字序列的更多相关文章
- 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]
题目传送门 数字序列 题目描述 给定一个整数序列 a1,a2,⋅⋅⋅,an ,求出一个递增序列 b1<b2<⋅⋅⋅<bn ,使得序列 ai 和 bi 的各项之差的绝对 ...
- 【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS
很有(\(bu\))质(\(hui\))量(\(xie\))的一个题目. 第一问:求最少改变几个数能把一个随机序列变成单调上升序列. \(Solution:\)似乎是一个结论?如果两个数\(A_i\) ...
- BZOJ1049 [HAOI2006]数字序列0
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ1049:[HAOI2006]数字序列(DP)
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列. 但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个 ...
- 洛谷P4331 [BOI2004]Sequence 数字序列(左偏树)
传送门 感觉……不是很看得懂题解在说什么? 我们先把原数列$a_i-=i$,那么本来要求递增序列,现在只需要求一个非严格递增的就行了(可以看做最后每个$b_i+=i$,那么非严格递增会变为递增) 如果 ...
- 洛谷$P4331\ [BOI2004]\ Sequence$ 数字序列 左偏树
正解:左偏树 解题报告: 传送门$QwQ$ 开始看到的时候$jio$得长得很像之前做的一个$dp$,,, 但是$dp$那题是说不严格这里是严格? 不难想到我们可以让$a_{i},b_{i}$同时减去$ ...
- BZOJ1049: [HAOI2006]数字序列
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题解: ydc的题解:http://pan.baidu.com/share/link?u ...
- 【BZOJ1049】 [HAOI2006]数字序列
BZOJ1049 [HAOI2006]数字序列 dp好题? 第一问 第一问我会做!令\(b_i=a_i-i\),求一个最长不下降子序列. \(n-ans\)就是最终的答案. 第二问 好难啊.不会.挖坑 ...
- 洛谷 P2501 [HAOI2006]数字序列 解题报告
P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
随机推荐
- virsh 查看hypervisor特性
[root@opennebula var]# virsh -c qemu:///system nodeinfo CPU model: x86_64 CPU(s): CPU frequency: MHz ...
- 如何从Win7上卸载Sql 2008 R2 Express,再重装
这两天,因工作需要,需要在一台新的机器上,Win7 64位英文操作系统上,安装Sql Server 2008 R2 Express,安装的过程中出现些问题,在查找问题的过程中,考虑重装 Sql Ser ...
- ubuntu opencv的使用
博客转载自:https://blog.csdn.net/u012816621/article/details/51732932 CMakeLists.txt # cmake needs this li ...
- Django-restframework25 Pagination(分页)
Django-restframework25 Pagination(分页) 2017年11月11日 15:14:36 敲代码的伪文青 阅读数:1021 标签: restful 更多 个人分类: res ...
- swing中的分层
swing中的分层 摘自:https://blog.csdn.net/levelmini/article/details/26692205 2014年05月23日 12:42:56 阅读数:1244 ...
- HightCharts开发总结
1. 简介:Highcharts是一款纯javascript编写的图表库,能够在Web网站或Web应用中添加交互性的图表,现在官方的最新版本为Highcharts-4.2.3. 2. 兼容性: ...
- App测试从入门到精通之更新测试
我们都知道,app在使用一段时间,都会有更新,而且更新会不止一次.在实际测试中,关于更新的测试场景也是我们需要重点关注的,接下来我们就看一下关于App的更新测试有哪些测试点我们需要注意: APP更新测 ...
- py_initialize:C调Python出错 是初始化错误?
还是pythonpath和pythonname变量没有配置正确? py_initialize()方法是什么? In an application embedding Python, this shou ...
- How Tomcat Works(十九)
本文重点关注启动tomcat时会用到的两个类,分别为Catalina类和Bootstrap类,它们都位于org.apachae.catalina.startup包下:Catalina类用于启动或关闭S ...
- C 可变参数的宏定义
宏定义 也能来可变参数..吼吼..方便好多.. #define T(x,y...) printf(x,##y); C99标准..这我也管不到.... 关键是那个 ... 和 ## 我也不推荐到首页.记 ...