第一问明显就是用b[i]=a[i]-i来做最长不下降子序列

然后第二问,对于一对f[i]=f[j]+1的(i,j),中间的数一定要改的,并且是等于b[i]或者b[j],我不会证,然后因为是随机数据,所以直接枚举断点用前缀和更新答案即可

证明见http://ydcydcy1.blog.163.com/blog/static/216089040201392851210681/

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=35005;
  7. int n,m,a[N],mn[N],f[N],h[N],cnt;
  8. long long g[N],s1[N],s2[N];
  9. struct qwe
  10. {
  11. int ne,to;
  12. }e[N<<1];
  13. int read()
  14. {
  15. int r=0,f=1;
  16. char p=getchar();
  17. while(p>'9'||p<'0')
  18. {
  19. if(p=='-')
  20. f=-1;
  21. p=getchar();
  22. }
  23. while(p>='0'&&p<='9')
  24. {
  25. r=r*10+p-48;
  26. p=getchar();
  27. }
  28. return r*f;
  29. }
  30. void add(int u,int v)
  31. {
  32. cnt++;
  33. e[cnt].ne=h[u];
  34. e[cnt].to=v;
  35. h[u]=cnt;
  36. }
  37. int ef(int x)
  38. {
  39. int l=1,r=m,ans=0;
  40. while(l<=r)
  41. {
  42. int mid=(l+r)>>1;
  43. if(mn[mid]<=x)
  44. l=mid+1,ans=mid;
  45. else
  46. r=mid-1;
  47. }
  48. return ans;
  49. }
  50. int main()
  51. {
  52. n=read();
  53. for(int i=1;i<=n;i++)
  54. a[i]=read()-i;
  55. a[++n]=1e9;
  56. memset(mn,0x3f,sizeof(mn));
  57. mn[0]=-1e9;
  58. for(int i=1;i<=n;i++)
  59. {
  60. int nw=ef(a[i]);
  61. f[i]=nw+1;
  62. m=max(m,f[i]);
  63. mn[nw+1]=min(mn[nw+1],a[i]);
  64. }
  65. for(int i=n;i>=0;i--)
  66. {
  67. add(f[i],i);
  68. g[i]=1e18;
  69. }
  70. g[0]=0;a[0]=-1e9;
  71. for(int x=1;x<=n;x++)
  72. for(int i=h[f[x]-1];i&&e[i].to<=x;i=e[i].ne)
  73. if(a[e[i].to]<=a[x])
  74. {
  75. for(int j=e[i].to;j<=x;j++)
  76. s1[j]=abs(a[e[i].to]-a[j]),s2[j]=abs(a[x]-a[j]);
  77. for(int j=e[i].to+1;j<=x;j++)
  78. s1[j]+=s1[j-1],s2[j]+=s2[j-1];
  79. for(int j=e[i].to;j<x;j++)
  80. g[x]=min(g[x],g[e[i].to]+s1[j]-s1[e[i].to]+s2[x]-s2[j]);
  81. }
  82. printf("%d\n%lld\n",n-f[n],g[n]);
  83. return 0;
  84. }

bzoj 1049: [HAOI2006]数字序列【dp+二分+瞎搞】的更多相关文章

  1. bzoj 1049 [HAOI2006]数字序列

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

  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】【Luogu P2501】 [HAOI2006]数字序列 DP,结论,LIS

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

  6. BZOJ1049:[HAOI2006]数字序列(DP)

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

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

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

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

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

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

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

随机推荐

  1. js 验证 输入值 全是中文

    1.代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  2. vim调用python格式化json数据

    vim调用python格式化json数据 November 30, 2013GNU/Linuxpython3, Vimopenwares python有个标准模块叫json,用于编码/解码,序列化/按 ...

  3. Effective C++ 43,44

    43.明智地使用多继承. 多继承带来了极大的复杂性.最主要的一条就是二义性. 当派生类为多继承时,其多个基类有同名的成员时,就会出现二义性.通常要明白其使用哪个成员的.显式地限制修饰成员不仅非常笨拙, ...

  4. UBUntu 软件 源配置方法

        近期公司产品须要添加一个功能,就是版本号自己主动更新.使用apt-get 实现. apt-get 软件源配置的方法,參见本人资源里的共享.以下是代码中作为升级的一部分.  FILE *fp; ...

  5. poj2406--Power Strings(kmp:求循环串的次数)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33163   Accepted: 13784 D ...

  6. find the longest of the shortest (hdu 1595 SPFA+枚举)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  7. AML LCD debuged

    root@k101:/ # cat /sys/class/lcd/debug                                          Usage:     echo basi ...

  8. [Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作

    public void clickReportIcon(){ String initialWindowHandle = driver.getWindowHandle(); //保存原始的浏览器窗口 p ...

  9. PR修改例子

    DATA: lt_items_old    LIKE TABLE OF bapiebanv   WITH HEADER LINE.   DATA: lt_items_new    LIKE TABLE ...

  10. 使用cwRsync在Windows的目录之间增量同步文件

    http://www.qiansw.com/using-cwrsync-in-the-windows-directory-between-the-incremental-synchronization ...