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,所以可以过!!、

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. #define Maxn 35010
  8. #define INF 0xfffffff
  9. #define LL long long
  10.  
  11. int a[Maxn],f[Maxn],g[Maxn];
  12. int n;
  13.  
  14. int myabs(int x) {return x<?-x:x;}
  15. int mymin(int x,int y) {return x<y?x:y;}
  16. LL mymin(LL x,LL y) {return x<y?x:y;}
  17.  
  18. int ffind(int l,int r,int x)
  19. {
  20. while(l<r)
  21. {
  22. int mid=(l+r+)>>;
  23. if(g[mid]<=x) l=mid;
  24. else r=mid-;
  25. }
  26. return l;
  27. }
  28.  
  29. void LIS()
  30. {
  31. int l=,r=;
  32. g[]=-INF;
  33. for(int i=;i<=n;i++)
  34. {
  35. if(a[i]>=g[r])
  36. {
  37. g[++r]=a[i];
  38. f[i]=r;
  39. }
  40. else
  41. {
  42. int x=ffind(l,r,a[i]);
  43. g[x+]=a[i];
  44. f[i]=x+;
  45. }
  46. }
  47. printf("%d\n",n-r);
  48. }
  49.  
  50. struct node
  51. {
  52. int x,y,next;
  53. }t[Maxn];int len;
  54.  
  55. int first[Maxn];
  56. void ins(int x,int y)
  57. {
  58. t[++len].x=x;t[len].y=y;
  59. t[len].next=first[x];first[x]=len;
  60. }
  61.  
  62. LL h[Maxn],s1[Maxn],s2[Maxn];
  63.  
  64. void get_ans()
  65. {
  66. len=;
  67. memset(first,,sizeof(first));
  68. for(int i=;i<=n;i++)
  69. {
  70. ins(f[i],i);
  71. }
  72. memset(h,,sizeof(h));
  73. h[]=;
  74. for(int i=;i<=n;i++)
  75. for(int j=first[f[i]-];j;j=t[j].next)
  76. {
  77. int y=t[j].y;
  78. if(y>i) continue;
  79. if(a[y]>a[i]) continue;
  80. s1[y]=;
  81. for(int k=y+;k<i;k++) s1[k]=s1[k-]+myabs(a[k]-a[y]);
  82. s2[i]=;
  83. for(int k=i-;k>y;k--) s2[k]=s2[k+]+myabs(a[k]-a[i]);
  84. for(int k=y;k<i;k++) h[i]=mymin(h[i],h[y]+s1[k]+s2[k+]);
  85. }
  86. printf("%lld\n",h[n]);
  87. }
  88.  
  89. int main()
  90. {
  91. scanf("%d",&n);
  92. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  93. for(int i=;i<=n;i++) a[i]-=i;
  94. a[]=-INF;a[++n]=INF;
  95. LIS();
  96. get_ans();
  97. return ;
  98. }

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. 【BZOJ】1602:[Usaco2008 Oct]牧场行走

    [算法]最近公共祖先(LCA) [题解] 点x,y到最近公共祖先z的距离之和相当于x,y到根的距离减去两倍z到根的距离, 即ans=dis[x]+dis[y]-2*dis[z] 记得边数组要开两倍!! ...

  2. Shuffle Cards(牛客第三场+splay)

    题目: 题意:将1~n的数进行m次操作,每次操作将第pi位到pi+si-1位的数字移到第一位,求最后的排列. 思路:现在还没不会写splay,在知道这是splay模板题后找了一波别人的模板,虽然过了, ...

  3. perl中的lock

    #!/usr/bin/env perl -w use strict; use threads; use threads::shared; ; print "count的起始值为:$count ...

  4. 【swupdate文档 一】嵌入式系统的软件管理

    嵌入式系统的软件管理 嵌入式系统变得越来越复杂, 它们的软件也反映了这种复杂性的增加. 为了支持新的特性和修复,很有必要让嵌入式系统上的软件 能够以绝对可靠的方式更新. 在基于linux的系统上,我们 ...

  5. device tree 負值 property 寫法

    倘若你要設定 負值的property, 可能需要括符才會 build 過. 正確 decidegc = <(-10)>; 錯誤 decidegc = <-10>;

  6. HDU 5129 Yong Zheng's Death

    题目链接:HDU-5129 题目大意为给一堆字符串,问由任意两个字符串的前缀子串(注意断句)能组成多少种不同的字符串. 思路是先用总方案数减去重复的方案数. 考虑对于一个字符串S,如图,假设S1,S2 ...

  7. java web 资源文件读取

    前提:假设web应用test(工程名) webapps下面有一资源文件test.html 规则:在获取资源时一般使用的是相对路径,以符号/开头,而 / 代表什么取决于这个地址给谁使用.服务器使用时,/ ...

  8. mysql 1709: Index column size too large. The maximum column size is 767 bytes.

    1709: Index column size too large. The maximum column size is 767 bytes. 修改排序规则解决 utf8_general_ci

  9. [New learn] 手势

    1.简介 我们经常会在设备上查看图片等, 也会经常将图片通过手指的捏合打开来缩小和方法图片.这就是ios中的手势功能在起作用. 那么手势好像也是一种touch事件,那和UIResponder中定义的t ...

  10. 2.C 基础

    C 基础 原文地址:http://rypress.com/tutorials/objective-c/c-basics OC 可以说是C语言的一个超集,这样你可以无缝的和C语言结合编程也就是你可以这两 ...