洛谷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.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
随机推荐
- 在英文Win7操作系统上部署C#开发的Web系统出现乱码的解决方法
今天,迁移机器,把一个使用C#开发的Web系统部署到一台英文版Win7操作系统上,部署好以后,系统可以登录,只是网页上出现汉字乱码. 在这台电脑上,打开Word等文本编辑器,是可以正常输入.显示中文的 ...
- suse10配置SSH无密码登录的方法
RSH配置(集群中的每台机器执行以下操作) 1.因SUSE LINUX不自带RSH-SERVER服务,所以首先要去从www.rpmfind.net 下载rsh-server服务的RPM包. 然后切换到 ...
- ShopNc登录
- 第一章Python简介
1.Python shell(Python命令解释器) 如下所示 2.Python的交互模式 如下 3.代码编辑器窗口 在上面的那些指令称为源代码. 4.在python中,缩进是有语法意义的. 在某行 ...
- POJ - 2586 Y2K Accounting Bug (找规律)
Accounting for Computer Machinists (ACM) has sufferred from the Y2K bug and lost some vital data for ...
- EBS登陆界面个性化
把完整资料贴出来 Set the profile option Local Login Mask (FND_SSO_LOCAL_LOGIN_MASK). (This profile option is ...
- [raspberry p3] suse wifi驱动加载
问题 raspberry pi3安装后发现wifi 启动不了, brcmf_sdio加载失败了,return error code为-110 处理方法 打开 /etc/dracut.conf.d/ra ...
- wp 取消button按下效果
<Style x:Key="ButtonStyle2" TargetType="Button"> <Setter Pro ...
- 表单使用clone方法后, 原有select无法生效
textarea和select的值clone的时候会丢掉,在clone的时候将val再重新赋值一下,如果知道这个了就加单了 测试发现,textarea和select的jquery的clone方法有 ...
- C# System.Threading.Timer 定时器
前提: 需要引入 System.Threading: 描述: 在很多时间我们都需要进行延迟执行,或是定时执行一些指定业务,这个时候使用 Timer 是最合适的,而且 Timer 是Cpu 级别处理对 ...