Codeforces 946G Almost Increasing Array (树状数组优化DP)
题目链接 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即可。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 2e5 + 10; int a[N], b[N], c[N << 1], d[N], e[N << 1];
int s1[N], s2[N];
int cnt, tot;
int n, mx, ans = 0; inline void up(int &a, int b){ if (a < b) a = b;}
void update(int x, int val){ for (; x <= mx; x += x & -x) up(c[x], val); }
int query(int x){ int ret = 0; for (; x; x -= x & -x) up(ret, c[x]); return ret;} int main(){ scanf("%d", &n);
rep(i, 1, n) scanf("%d", a + i);
rep(i, 1, n) b[i] = a[i] - i, d[i] = a[i] - i + 1;
rep(i, 1, n) e[++tot] = b[i], e[++tot] = d[i];
sort(e + 1, e + n * 2 + 1); cnt = unique(e + 1, e + tot + 1) - e - 1;
rep(i, 1, n) b[i] = lower_bound(e + 1, e + cnt + 1, b[i]) - e;
rep(i, 1, n) d[i] = lower_bound(e + 1, e + cnt + 1, d[i]) - e; memset(c, 0, sizeof c);
mx = 4e5;
rep(i, 1, n){
s1[i] = query(b[i]) + 1;
update(b[i], s1[i]);
} memset(c, 0, sizeof c);
rep(i, 1, n) d[i] = mx - d[i] + 1; dec(i, n, 1){
s2[i] = query(d[i]) + 1;
update(d[i], s2[i]);
} rep(i, 1, n) d[i] = mx - d[i] + 1; memset(c, 0, sizeof c);
ans = s1[n - 1];
up(ans, s2[2]); rep(i, 2, n){
up(ans, query(d[i]) + s2[i]);
update(b[i - 1], s1[i - 1]);
} memset(c, 0, sizeof c);
rep(i, 1, n) b[i] = mx - b[i] + 1, d[i] = mx - d[i] + 1; dec(i, n - 1, 1){
up(ans, query(b[i]) + s1[i]);
update(d[i + 1], s2[i + 1]);
} printf("%d\n", n - ans - 1);
return 0;
}
Codeforces 946G Almost Increasing Array (树状数组优化DP)的更多相关文章
- Codeforces 909C Python Indentation:树状数组优化dp
题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...
- HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)
题目链接 2017 CCPC Harbin Problem K 题意 给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...
- LUOGU P2344 奶牛抗议 (树状数组优化dp)
传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...
- 【题解】Music Festival(树状数组优化dp)
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...
- 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)
[题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...
- Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...
- BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...
- BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)
分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...
- 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp
显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...
随机推荐
- selenium IDE录制脚本和自定义脚本-->Katalon Recorder(二)
selenium IDE提供了两种生成脚本的方式:录制脚本和自定义脚本 录制脚本:1.打开firefox空白标签,在标签上输入需要录制脚本的网址:2.打开selenium IDE界面中的录制按钮(圆形 ...
- [C++] 拓展属性
inline函数 函数重载 占位参数和默认参数 /*__________________________________________________________________ 背景: C++ ...
- ThreadLocal 学习
JDK 1.2版本就已经提供了java.lang.ThreadLocal.其为多线程程序的并发问题提供了一种新的思路.使用该工具类可以简洁地编写出优美的多线程程序. 当使用ThreadLocal维护变 ...
- 融合模型Aggregation
从一堆弱分类器融合得到强分类器. 比如假设现在你只能水平或竖直线分割,那么无论如何都分不好,但是假设组合三次分割,就会得到如图所示的一个较好的分割线. 再比如,PLA 融合后有large margin ...
- 电脑显卡4种接口类型:VGA、DVI、HDMI、DP
电脑显卡全称显示接口卡(Video card,Graphics card),又称为显示适配器(Video adapter),显示器配置卡简称为显卡,是个人电脑最基本组成部分之一.对于显卡接口类型,主要 ...
- VS调试时不捕捉Exception
在方法上添加 [DebuggerHidden] 这样,发生错误的时候,VS就不会捕捉到这个错误,否则,会在错误的地方中断. [DebuggerHidden] public void DeleteAll ...
- c#用UpdatePanel实现接局部刷新
通常我们看到局部刷新就会想到Ajax,但是我今天要说的是c#的一个控件,只要把服务器按钮和要刷新的区域放在该控件内就能实现局部刷新. 当然它必须和ScriptManager控件一起使用. Update ...
- ThreadPoolExecutor源码解析
LZ目前正在做一个批量生成报表的系统,需要定时批量生成多张报表,便考虑使用线程池来完成.JDK自带的Executors工具类只提供创建固定线程和可伸展但无上限的两个静态方法,并不能满足LZ想自定制线程 ...
- 写把proto函数搞清楚
在做blk层之前,先把proto搞清楚 ffi_lua metatype可以给函数加方法, lua中冒号是啥意思?冒号会传入self,但是点号不会传入self
- linux sed讲解
1.sed 查找替换 显示某一行或某几行##替换sed 's###g' oldboy.txtsed 's@@@g' oldboy.txt sed -i 's###g' oldboy.txtsed -i ...