题意:数列A1,A2,...,AN,修改最少的数字,使得数列严格单调递增。(1<=N<=10^5; 1<=Ai<=10^9 )

思路:首先要明白的一点是数列是严格单调递增,那么没有修改的最长上升子序列也是严格单调递增的,并且是满足要求的。

何为满足要求? 假设A(a)---B(b)---C(c)……是一个符合要求的不修改序列,括号内为下标,那么有B-A>=b-a,这样才能满足夹在中间的数能够修改。

那么本题在nlogn求最长上升子序列的基础做一些处理即可。

处于满足的序列中必须有a[i]-lis[x]-1>=i-pos[x]-1,并且替换的时候不是原来的找到大于这个值的最小的,而是找满足前面这个式子已求序列中最大的。

比如序列:1 3 6 6 13 2 8 9 10,求最长上升子序列过程中当求得的序列为 1 3 6 13 时,当遇见8时,我们不是变为1 3 6 8,而是变成1 3 8, 因为只有这样才是满足条件的,当时它的最长序列top=4不会变化。

还要注意的一点是lis[0]初始化为-oo,因为a[i]可以修改为负数。

 #include<cstdio>
#include<iostream>
using namespace std; const int maxn=;
const int oo=0x3fffffff;
int a[maxn];
int lis[maxn], pos[maxn]; int main()
{
int n;
while(cin >> n)
{
for(int i=; i<=n; i++) scanf("%d",a+i);
int top=;
lis[]=-oo;
for(int i=; i<=n; i++)
{
if(a[i]>lis[top]&&a[i]-lis[top]->=i-pos[top]-)
{
lis[++top]=a[i];
pos[top]=i;
}
else
{
int l=, r=top, tp=-;
while(l<=r)
{
int mid=(l+r)>>;
if(a[i]-lis[mid]->=i-pos[mid]-)
{
tp=mid;
l=mid+;
}
else r=mid-;
}
if(tp!=-) lis[tp+]=a[i], pos[tp+]=i;
}
}
cout << n-top <<endl;
}
return ;
}
/*
5
1 6 6 7 8
7
1 2 2 2 2 2 7
9
1 3 6 6 13 2 8 9 10
13
1 2 2 3 10 6 6 6 6 6 7 8 9
11
1 2 3 4 10 10 7 8 9 10 10
*/

满足要求的最长上升子序列(nlogn)的更多相关文章

  1. HDU 1025 Constructing Roads In JGShining's Kingdom(求最长上升子序列nlogn算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 解题报告:先把输入按照r从小到大的顺序排个序,然后就转化成了求p的最长上升子序列问题了,当然按p ...

  2. 【算法】最长公共子序列(nlogn)

    转载注明出处:http://blog.csdn.net/wdq347/article/details/9001005 (修正了一些错误,并自己重写了代码) 最长公共子序列(LCS)最常见的算法是时间复 ...

  3. [poj 1533]最长上升子序列nlogn树状数组

    题目链接:http://poj.org/problem?id=2533 其实这个题的数据范围n^2都可以过,只是为了练习一下nlogn的写法. 最长上升子序列的nlogn写法有两种,一种是变形的dp, ...

  4. HDU5748---(记录每个元素的 最长上升子序列 nlogn)

    分析: 给一个序列,求出每个位置结尾的最长上升子序列 O(n^2) 超时 #include "cstdio" #include "algorithm" #def ...

  5. 最长公共子序列 nlogn

    先来个板子 #include<bits/stdc++.h> using namespace std; , M = 1e6+, mod = 1e9+, inf = 1e9+; typedef ...

  6. DP练习 最长上升子序列nlogn解法

    openjudge 百练 2757:最长上升子序列 总时间限制:  2000ms 内存限制:  65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候, ...

  7. NYOJ 214 最长上升子序列nlogn

    普通的思路是O(n2)的复杂度,这个题的数据量太大,超时,这时候就得用nlogn的复杂度的算法来做,这个算法的主要思想是只保存有效的序列,即最大递增子序列,然后最后得到数组的长度就是最大子序列.比如序 ...

  8. 最长上升子序列nlogn算法

    LIS问题是经典的动态规划问题,它的状态转移相信大家都很熟悉: f[i] = f[k] + 1  (k < i 且 A[k] < A[i]) 显然这样做复杂度是O(n^2) 有没有更快的算 ...

  9. 最长递增子序列nlogn的做法

    费了好大劲写完的  用线段树维护的 nlogn的做法再看了一下 大神们写的 nlogn  额差的好远我写的又多又慢  大神们写的又少又快时间  空间  代码量 哪个都赶不上大佬们的代码 //这是我写的 ...

  10. hdu1950 最长上升子序列nlogn

    简单. #include<cstdio> #include<cstring> #include<iostream> using namespace std; ; i ...

随机推荐

  1. bat

    1.输出系统时间,利用系统时间做文件名 @echo offset filename=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%ti ...

  2. file-max与ulimit的关系与差别

    典型的,提供大量静态文件访问的web服务器,缓存服务器(如squid), 均要注意这个问题 网上的教程,大约只是简单说明了如何设置ulimit和file-max, 但并没有说清楚这两者之间的差别,让人 ...

  3. java 线程演示

    package unit8; public class Mainthread { public static void main(String[] args) { Thread t = new Thr ...

  4. 20145223《Java程序程序设计》实验报告5

    20145223杨梦云<Java网络编程> 一.实验内容 ·1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: ·2.利用加解密代码包,编译运行代码,一人加密,一人解密: ·3. ...

  5. delphi中VirtualStringTree树使用方法之终结篇!

    VirtualStringTree 的用法详解:作者:张志宝go淘宝 例子:创建了一个树名为VirtualStringTree1,第一列显示数据库字段ID的值,标题为编号:第二列显示字段Name的值, ...

  6. bluetooth 蓝牙协议和标准,配置

    Bluetooth 配置文件表达了一般行为,Bluetooth 设备可以通过这些行为与其它设备进行通信.Bluetooth 技术定义了广泛的配置文件,描述了许多不同类型的使用案例.为了使用 Bluet ...

  7. Visual Studio: whether auto-building when press the debug button

    Tools -> Options -> Projects and Solutions->Build and Run -> choose an option for On Run ...

  8. BZOJ2769 : YY的快速排序

    将数字离散化并去重,则对于一对逆序对$i<j$,$a_i>a_j$,贡献为$\frac{2}{a_i-a_j+1}$,因此只要对于每个差值统计出对应的逆序对个数即可. 将序列分块,块内平方 ...

  9. CNN训练Cifar-10技巧

    关于数据集 Cifar-10是由Hinton的两个大弟子Alex Krizhevsky.Ilya Sutskever收集的一个用于普适物体识别的数据集.Cifar是加拿大政府牵头投资的一个先进科学项目 ...

  10. hdu2094 set初体验

    有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C.如果A打败了B,B又打败了C,而 ...