codeforces 946G
题意:
有一个长度为n的数组a。你可以删除一个位置之后进行操作,一次操作可以把任意位置上的数字变成任意的值,问最少需要多少操作能使得数列变成严格上升的。
n<=200000
分析:
如果没有删除,那是个经典问题,我们只要对{ai-i}求最长不降子序列就行了
现在有个删除,若删除一个元素,那么它后面那些元素的位权-1,所以对于每个位置我们关心的只是它的位权是i还是i-1
于是考虑dp,dp[0][i][j]表示做完了前i个位置,之前没有删除元素,长度为j的不降子序列最后一位的最小值,dp[1][i][j]同理
考虑转移,dp[0][i]=(a[i]-i)二分插入dp[0][i-1],dp[1][i]的每个位置=min((a[i]-i+1)二分插入dp[1][i-1], dp[0][i-1])
其中dp[1][i][j]=min(dp[1][i][j],dp[0][i-1][j])这个转移很不好,是O(n)的,其它转移都是O(logn)的是可以接受的
仔细观察发现,实际上只有上一次的a[i-1]-(i-1)插入的位置可能会更新此时的dp[1][i],所以这个转移其实可以做到O(1)
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5,inf=2e9;
int dp[][maxn+];
int a[maxn+];
int n,len0,len1;
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%d",&a[i]);
for(int i=;i<=n;++i) dp[][i]=dp[][i]=inf;
int last=;
dp[][]=a[]-,len0=;
for(int i=;i<=n;++i)
{
int p=upper_bound(dp[]+,dp[]+len1+,a[i]-i+)-dp[];
dp[][p]=a[i]-i+;
len1=max(len1,p); dp[][last]=min(dp[][last],dp[][last]);
len1=max(len1,last); p=upper_bound(dp[]+,dp[]+len0+,a[i]-i)-dp[];
dp[][p]=a[i]-i;
last=p;
len0=max(len0,p);
}
printf("%d\n",min(n-len0,n-len1-));
return ;
}
codeforces 946G的更多相关文章
- Codeforces 946G Almost Increasing Array (树状数组优化DP)
题目链接 Educational Codeforces Round 39 Problem G 题意 给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数. ...
- [Codeforces 946G]Almost Increasing Array
Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) .现在准许你删除任意一个数,删除之后需要修改最小的次数使序列单调递增.问最小次数. \(1\leq n\leq 200 ...
- Almost Increasing Array CodeForces - 946G (dp)
大意: 定义几乎递增序列为删除不超过一个数后序列严格递增. 给定序列, 求最少改变多少个数能变为几乎递增序列. 跟hdu5256类似,
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- Hibernate中get()与load()的区别,以及关于ThreadLocal的使用方法
一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时 ...
- javaEE(1)_web开发入门
一.WEB开发的相关知识 1.WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源(如html 页 ...
- 欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍
1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x* ...
- html中footer如何一直保持在页底
最近在开发博客过程中,遇到有些body的height是比window的height要低的,然后就出现了footer在页面中间的尴尬样子.那么这种情况怎么解决呢: 首先,写一个footer标签: < ...
- ClientAbortException:java.io.IOException解决方案
org.apache.catalina.connector Class ClientAbortException java.lang.Object java.lang.Throwable java.l ...
- sram bist scripts
主要三个script: mbist_run: call mbistarchitect tool run.do:run bist flow bist setup => bist mode(bis ...
- PERL学习之模式匹配
一.简介 模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def.其用法如结合函数split将字符串用某模式分成多个单词:@array = split(/ /, $line); ...
- shell-code-1
#!/bin/bash # online test tool: http://www.shucunwang.com/RunCode/shell/ name="pxy"#Attent ...
- 数据结构之--图(Graphics)
1.1:图的定义和术语 图是一种比线性表和树更为复杂的数据结构.在线性表中,数据元素之间仅有线性关系,每个元素仅有一个直接前驱和一个直接后继:在树形结构中,数据元素之间有着明显的层次关系,并且每一 ...
- pymongo使用方法
MongoDB存储 在这里我们来看一下Python3下MongoDB的存储操作,在本节开始之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python 的PyMong ...