1049: [HAOI2006]数字序列

Description

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

Input

  第一行包含一个数n,接下来n个整数按顺序描述每一项的键值。n<=35000,保证所有数列是随机的

Output

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

Sample Input

4
5 2 3 5

Sample Output

1
4

HINT

Source

【分析】  

  首先先每个数减去标号,变成<=的问题。

  第一问显然是LIS。用传统nlogn打法就好了。

  第二问,明显DP转移方程为:

      g[i]=min{g[j]+cost(j,i)|f[j]+1==f[i]}

  问题还是求cost(j,i)

  如果满足f[j]+1==f[i],那么中间的元一定要不>=a[i],要不<=a[j]。

  画个图想一想就知道一定有一个最优解是前半部分等于a[j],后半部分等于a[i]。

  

  本来以为这题和上一题BZOJ 1367有异曲同工之妙,事实上这题要简单很多的啊ORZ。。。

  只要后面好好搞,其实随机数据没有n^3,所以可以过!!、

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 35010
#define INF 0xfffffff
#define LL long long int a[Maxn],f[Maxn],g[Maxn];
int n; int myabs(int x) {return x<?-x:x;}
int mymin(int x,int y) {return x<y?x:y;}
LL mymin(LL x,LL y) {return x<y?x:y;} int ffind(int l,int r,int x)
{
while(l<r)
{
int mid=(l+r+)>>;
if(g[mid]<=x) l=mid;
else r=mid-;
}
return l;
} void LIS()
{
int l=,r=;
g[]=-INF;
for(int i=;i<=n;i++)
{
if(a[i]>=g[r])
{
g[++r]=a[i];
f[i]=r;
}
else
{
int x=ffind(l,r,a[i]);
g[x+]=a[i];
f[i]=x+;
}
}
printf("%d\n",n-r);
} struct node
{
int x,y,next;
}t[Maxn];int len; int first[Maxn];
void ins(int x,int y)
{
t[++len].x=x;t[len].y=y;
t[len].next=first[x];first[x]=len;
} LL h[Maxn],s1[Maxn],s2[Maxn]; void get_ans()
{
len=;
memset(first,,sizeof(first));
for(int i=;i<=n;i++)
{
ins(f[i],i);
}
memset(h,,sizeof(h));
h[]=;
for(int i=;i<=n;i++)
for(int j=first[f[i]-];j;j=t[j].next)
{
int y=t[j].y;
if(y>i) continue;
if(a[y]>a[i]) continue;
s1[y]=;
for(int k=y+;k<i;k++) s1[k]=s1[k-]+myabs(a[k]-a[y]);
s2[i]=;
for(int k=i-;k>y;k--) s2[k]=s2[k+]+myabs(a[k]-a[i]);
for(int k=y;k<i;k++) h[i]=mymin(h[i],h[y]+s1[k]+s2[k+]);
}
printf("%lld\n",h[n]);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) a[i]-=i;
a[]=-INF;a[++n]=INF;
LIS();
get_ans();
return ;
}

2017-01-17 10:33:31

【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)的更多相关文章

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

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

  2. bzoj 1049 [HAOI2006]数字序列

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

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

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

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

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

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

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

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

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

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

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

  8. [luogu2501 HAOI2006] 数字序列 (递推LIS)

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

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

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

随机推荐

  1. 【BZOJ4373】算术天才⑨与等差数列 [线段树]

    算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 算术天才⑨非常喜欢和等 ...

  2. MFC单文档框架分析及执行流程(转)

    原文转自 https://blog.csdn.net/u011619422/article/details/40402705 首先来分析一下MFC单文档类的结构: 它包括如下几个类: CAboutDl ...

  3. Python学习笔记 - day13 - 进程与线程

    概述 我们都知道windows是支持多任务的操作系统. 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多 ...

  4. Shell脚本中引用、调用另一个脚本文件的2种方法

    Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm

  5. 根据日期查询年龄js

    function ages(str) { var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); if(r==null)return f ...

  6. Network——物理层-练习题与解答

    1. 无线电天线通常在其直径等于无线电波的波长的情况下工作效果最好.合理的天线直径的范围是从1厘米到5米.问所覆盖的频率范围是怎样的? 解答: λf = c , c=3x108 (m/s) 对于λ=1 ...

  7. python traceback

    1. Python中的异常栈跟踪 之前在做Java的时候,异常对象默认就包含stacktrace相关的信息,通过异常对象的相关方法printStackTrace()和getStackTrace()等方 ...

  8. CCF试题:高速公路(Targin)

    问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...

  9. 把web项目部署到tomcat上

    首先在服务器搭建JDK环境:https://www.cnblogs.com/lb809663396/p/5855877.html 然后把tomcat文件包复制到服务器上,访问http://localh ...

  10. Linux的文件帮助和运行级别

    man命令相关:man -1 +参数 表示查询第几章的帮助说明man -k +参数 表示以该参数为关键字查询所有相关命令或文件命令 --help 简单查询命令使用说明具体的帮助文档存储在/usr/sh ...