题目链接   Educational Codeforces Round 39 Problem G

题意  给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数。

Almost Increasing Array为删掉至多一个元素之后可以成为严格递增子序列的数列。

这类题有个常见的套路,就是对每个元素减去下标之后求LIS。

这道题中可以删去一个元素,我们可以枚举哪个元素是被删掉的,

那么他之前的元素求LIS的时候真正的值为$a_{i} - i$,他之后的元素求LIS的时候真正的值为$a_{i} - i + 1$,

最后取LIS的最大值$ans$,答案即为$n - ans - 1$。

用树状数组优化DP即可。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(i, a, b) for (int i(a); i <= (b); ++i)
  6. #define dec(i, a, b) for (int i(a); i >= (b); --i)
  7.  
  8. const int N = 2e5 + 10;
  9.  
  10. int a[N], b[N], c[N << 1], d[N], e[N << 1];
  11. int s1[N], s2[N];
  12. int cnt, tot;
  13. int n, mx, ans = 0;
  14.  
  15. inline void up(int &a, int b){ if (a < b) a = b;}
  16. void update(int x, int val){ for (; x <= mx; x += x & -x) up(c[x], val); }
  17. int query(int x){ int ret = 0; for (; x; x -= x & -x) up(ret, c[x]); return ret;}
  18.  
  19. int main(){
  20.  
  21. scanf("%d", &n);
  22. rep(i, 1, n) scanf("%d", a + i);
  23. rep(i, 1, n) b[i] = a[i] - i, d[i] = a[i] - i + 1;
  24. rep(i, 1, n) e[++tot] = b[i], e[++tot] = d[i];
  25. sort(e + 1, e + n * 2 + 1);
  26.  
  27. cnt = unique(e + 1, e + tot + 1) - e - 1;
  28. rep(i, 1, n) b[i] = lower_bound(e + 1, e + cnt + 1, b[i]) - e;
  29. rep(i, 1, n) d[i] = lower_bound(e + 1, e + cnt + 1, d[i]) - e;
  30.  
  31. memset(c, 0, sizeof c);
  32. mx = 4e5;
  33. rep(i, 1, n){
  34. s1[i] = query(b[i]) + 1;
  35. update(b[i], s1[i]);
  36. }
  37.  
  38. memset(c, 0, sizeof c);
  39. rep(i, 1, n) d[i] = mx - d[i] + 1;
  40.  
  41. dec(i, n, 1){
  42. s2[i] = query(d[i]) + 1;
  43. update(d[i], s2[i]);
  44. }
  45.  
  46. rep(i, 1, n) d[i] = mx - d[i] + 1;
  47.  
  48. memset(c, 0, sizeof c);
  49. ans = s1[n - 1];
  50. up(ans, s2[2]);
  51.  
  52. rep(i, 2, n){
  53. up(ans, query(d[i]) + s2[i]);
  54. update(b[i - 1], s1[i - 1]);
  55. }
  56.  
  57. memset(c, 0, sizeof c);
  58. rep(i, 1, n) b[i] = mx - b[i] + 1, d[i] = mx - d[i] + 1;
  59.  
  60. dec(i, n - 1, 1){
  61. up(ans, query(b[i]) + s1[i]);
  62. update(d[i + 1], s2[i + 1]);
  63. }
  64.  
  65. printf("%d\n", n - ans - 1);
  66. return 0;
  67. }

Codeforces 946G Almost Increasing Array (树状数组优化DP)的更多相关文章

  1. Codeforces 909C Python Indentation:树状数组优化dp

    题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...

  2. HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)

    题目链接  2017 CCPC Harbin Problem K 题意  给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...

  3. LUOGU P2344 奶牛抗议 (树状数组优化dp)

    传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...

  4. 【题解】Music Festival(树状数组优化dp)

    [题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...

  5. 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)

    [题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...

  6. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  7. BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  8. BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)

    分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...

  9. 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp

    显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...

随机推荐

  1. 《算法》C++代码 Dijkstra

    单源最短路,复杂度是O(N²),堆优化的是O(NlogN).基本思想是贪心,每次都加入一个当前最近的点,可以证明每次当时最近的点就是当前最短的路径.因此,所有点都加入之后,起点到所有点的最短路径就都求 ...

  2. 【Decision Tree】林轩田机器学习技法

    首先沿着上节课的AdaBoost-Stump的思路,介绍了Decision Tree的路数: AdaBoost和Decision Tree都是对弱分类器的组合: 1)AdaBoost是分类的时候,让所 ...

  3. Python 3基础教程9-函数

    本文介绍Python中的函数,主要了解如何定义一个函数,如何调用一个函数. 如果上面你不写调用函数这行代码,你运行后,是没有打印输出的.我们这里来,结合前面的if语句来定义一个,两个数比较,判断最大的 ...

  4. CodeForces-757B Bash's Big Day

    题目链接 https://vjudge.net/problem/CodeForces-757B 题目 Description Bash has set out on a journey to beco ...

  5. Android 启动项 Activity

    使用SDK创建一个App的时候,基本都会看到这段代码: <activity android:name=".ExampleActivity" android:icon=&quo ...

  6. Oracle常用数据库系统表单以及SQL的整理

    因为最近涉及到了一些数据库的归档,备份等工作,所以一部分的重心放在了数据库上,毕竟之前对数据库的了解也只停留在了一般的建表,查询,最多最多再写一写触发器之类的东西. 通常都是自己瞎搞搞,也就懂一点皮毛 ...

  7. BETA(1)

    目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...

  8. (总结)Nginx使用的php-fpm的两种进程管理方式及优化

    PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...

  9. Struts2基本程序演示

    Struts2启动配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns=" ...

  10. 【bzoj3561】DZY Loves Math VI 莫比乌斯反演

    题目描述 给定正整数n,m.求   输入 一行两个整数n,m. 输出 一个整数,为答案模1000000007后的值. 样例输入 5 4 样例输出 424 题解 莫比乌斯反演 (为了方便,以下公式默认$ ...