【bzoj1049】[HAOI2006]数字序列

Description

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

Input

第一行包含一个数n,接下来n个整数按顺序描述每一项的键值。

Output

第一行一个整数表示最少需要改变多少个数。 第二行一个整数,表示在改变的数最少的情况下,每个数改变的绝对值之和的最小值。

Sample Input

4
5 2 3 5

Sample Output

1
4

HINT

【数据范围】

90%的数据n<=6000。

100%的数据n<=35000。

保证所有数列是随机的。

这是证明:

http://pan.baidu.com/share/link?uk=2651016602&shareid=1490516411

题解:

    这道题目第一问是十分简单,但是我wrong了好久。

    第二问是变化幅度。

    对于第一问,因为a[i]-a[j]>=i-j

    所以(a[i]-i)-(a[j]-j)>=0

    所以可以设b[i]=a[i]-i

    所以只需要b[i]-b[j]>=0即可

    fz[i]表示当前这个点到i这个点为结尾的最大长度。

    g[i]表示1-i之间的答案。

    g[i]=min g[j]+w[j+1,i],转移条件是fz[j]+1=fz[i]

    有一个结论,在j-i中会有一个t,使得j--t都是b[j],t+1--i都是b[i],

    然后就是暴力即可。

 #include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector> #define ll long long
#define N 350007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>='')
{
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
return x*f;
} int n;
ll g[N],s1[N],s2[N];
int a[N],b[N],num,f[N],fz[N];
vector<int>ve[N]; void mid_find(int x,int i)
{
int l=,r=num;
while(l<r)
{
int mid=(l+r)>>;
if (f[mid]<=x) l=mid+;
else r=mid;
}
if (f[r]<=x) f[++num]=x,fz[i]=num;
else f[r]=x,fz[i]=r;
}
void solve_lis()
{
for (int i=;i<=n;i++)
{
b[i]=a[i]-i,g[i]=(1LL<<);
mid_find(b[i],i);
//fz[i]=num;
ve[fz[i]].push_back(i);
}
printf("%d\n",n-fz[n]);
}
void solve()
{
b[]=-(<<);ve[].push_back();
for (int i=;i<=n;i++)
{
for (int j=;j<ve[fz[i]-].size();j++)
{
int pst=ve[fz[i]-][j];
if (b[pst]>b[i]) continue;
for (int k=pst;k<=i;k++)
s1[k]=abs(b[k]-b[pst]),s2[k]=abs(b[k]-b[i]);
for (int k=pst+;k<=i;k++)
s1[k]+=s1[k-],s2[k]+=s2[k-];
for (int k=pst;k<i;k++)
g[i]=min(g[i],g[pst]+s1[k]-s1[pst]+s2[i]-s2[k]);
}
}
printf("%lld",g[n]);
}
int main()
{
n=read();for (int i=;i<=n;i++) a[i]=read();a[++n]=(<<);
solve_lis();
solve();
}

bzoj 1049 [HAOI2006]数字序列的更多相关文章

  1. bzoj 1049: [HAOI2006]数字序列【dp+二分+瞎搞】

    第一问明显就是用b[i]=a[i]-i来做最长不下降子序列 然后第二问,对于一对f[i]=f[j]+1的(i,j),中间的数一定要改的,并且是等于b[i]或者b[j],我不会证,然后因为是随机数据,所 ...

  2. 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)

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

  3. 【BZOJ】1049: [HAOI2006]数字序列(lis+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题意:给一个长度为n的整数序列.把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希 ...

  4. 1049: [HAOI2006]数字序列 - BZOJ

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

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

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

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

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

  7. 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)

    2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...

  8. 洛谷P2501 bzoj1049 [HAOI2006]数字序列

    题目链接 bzoj 洛谷 题解 第一问: 假如 \(i < j\) 如果 \(j\)能从\(i\)转移过来 显然中间空隙必须足够 例如:\(50\) \(53\) \(53\) \(52\) 就 ...

  9. BZOJ1049 [HAOI2006]数字序列0

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

随机推荐

  1. linux下的c程序排版工具:indent 分类: linux 2014-06-14 20:05 720人阅读 评论(0) 收藏

    Linux下有一个方便的c语言程序排版工具,只要选择恰当的参数,可以轻易地使自己的程序具有统一的风格. 当然首先要安装indent,执行命令:apt-get install indent indent ...

  2. RMAN-06564错误的原因及解决办法

    今日在进行数据库恢复时,遭遇RMAN-06564错误,如下: RMAN> restore spfile from autobackup; Starting restore at 01-NOV-1 ...

  3. C# PropertyInfo(官网)

    using System; using System.Reflection; class Module1 { public static void Main() { // This variable ...

  4. Oracle事务控制语言

    事务控制语言在各大数据库中都差不多,本文讲讲Oracle和别的数据库不一样的地方 Oracle每条sql语句都是一个事务,像insert.update.delete之类的,每次执行过都要commit提 ...

  5. IIS7.0中Process打开cmd程序出现问题

    本人在VS中用Process打开cmd程序,并传入参数,转换图片,运行成功! 但是放入IIS7.0中,Process打不开cmd程序,程序直接运行过去,无结果,无报错! 解决方案: 将IIS里面你程序 ...

  6. Git ---创建和切换分支

    ······································································"天下武功,唯快不破" git分支: g ...

  7. 黑马程序员----java基础:异常

    dff ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 经常写程序的人对try...catch...finally语句肯定是不陌生的了.但是好多 ...

  8. spring cloud 概念

    微服务构架需要使用场景: 1.可以将一个系统拆分成几个系统. 2.每个子系统可以部署多个应用,多个应用之间可以使用负载均衡. 3.需要一个服务注册中心,所有的服务都在一个注册中心注册,负载均衡也是通过 ...

  9. 【转】用jquery编写动态的返回顶部特效

    jquery代码: function gotoTop(min_height){ //预定义返回顶部的html代码,它的css样式默认为不显示 var gotoTop_html = '<div i ...

  10. charset - 设置 G0/G1 字符集槽中的一个的 ACM

    总览 (SYNOPSIS) charset [-v] G0|G1 [cp437|iso01|vt100|user|<acm_name>] 描述 (DESCRIPTION) linux 终端 ...