现在的位置: 首页 > 综合 > 正文

模拟赛 Incr(时间限制:1s;空间限制:128MB)

2018年04月24日 ⁄ 综合 ⁄ 共 870字 ⁄ 字号 评论关闭

题目描述

数列 A1,A2,...,AN,修改最少的数字,使得数列严格单调递增。

输入格式

第 1 行,1 个整数 N
第 2 行,N 个整数 A1,A2,...,AN

输出格式

1 个整数,表示最少修改的数字

样例输入

3
1 3 2

样例输出

1

数据范围

对于 50% 的数据,N ≤ 10^3
对于 100% 的数据,1 ≤ N ≤ 10^5,1 ≤ Ai ≤ 10^9

题解

这道题是河南06年省选一试的弱化版。nlogn的最长不降子序列要普及。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define MAXN 100002
#define ll long long
#define inf 1e15
using namespace std;
int n,f[MAXN],ans=1,l,r;
ll a[MAXN],b[MAXN];
void init()
{
	scanf("%d",&n);
	int i;
	for(i=1;i<=n;i++)
	   {scanf("%I64d",&a[i]);
	    a[i]=a[i]+n-i+1;
	   }
}
int erf(ll x)
{
	int s=l,t=r,mid,w;
	while(s<=t)
	   {mid=(s+t)>>1;
	    if(b[mid]<=x) w=mid,s=mid+1;
	    else t=mid-1;
	   }
	return w;
}
void dp()
{
	int i,w;
	for(i=1;i<=n;i++) b[i]=inf;
	f[1]=1; b[1]=a[1]; b[0]=-inf;
	l=0; r=1;
	for(i=2;i<=n;i++)
	   {w=erf(a[i]);
	    f[i]=w+1; b[w+1]=min(b[w+1],a[i]);
	    if(w==r) r++;
	    ans=max(ans,f[i]);
	   }
	printf("%d\n",n-ans);
}
int main()
{
	freopen("incr.in","r",stdin);
	freopen("incr.out","w",stdout);
	init(); dp();
	return 0;
}

抱歉!评论已关闭.