套题整理 Orz DXY
Posted Radiumlrb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了套题整理 Orz DXY相关的知识,希望对你有一定的参考价值。
弱弱的DXY
题目描述
DXY太弱了,以至于他已经不知道要如何解决调整一个数列的使得他变成一个严格上升序列。
输入格式
第 1 行,1 个整数 N
第 2 行,N 个整数 A1,A2,...,AN
输出格式
1 个整数,表示最少需要修改的多少个数字,使得数列变成单调上升的序列。
样例输入
3
1 3 2
样例输出
1
数据:
对于50%的数据:N<=1000
对于100%的数据:N<=100000
保证所有输入整数<=2^63-1
由于数据比较弱所以可以直接写成最长上升子序列然后n-f[n]骗骗分(大雾)
正解的话是把位置i上的数字减去i,做不下降子序列就好了,不过普通dp会T要找nlogn的做法QAQ
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #define LiangJiaJun main 8 #define INF 1999122700 9 using namespace std; 10 int a[100004]; 11 int unset[100004],n; 12 int cnt=0; 13 int erfen(int x){ 14 int l=0,r=n,ans=0; 15 while(l<=r){ 16 int mid = (l+r) >> 1; 17 if(unset[mid]>x)r=mid-1; 18 else{ 19 ans = mid; 20 l = mid + 1; 21 } 22 } 23 return ans; 24 } 25 int LiangJiaJun(){ 26 freopen("loser.in","r",stdin);freopen("loser.out","w",stdout); 27 scanf("%d",&n); 28 for(int i=1;i<=n;i++){ 29 scanf("%d",&a[i]); 30 a[i]-=i; 31 } 32 for(int i=0;i<=n+1;i++)unset[i]=INF; 33 unset[1]=a[1];unset[0]=-INF; 34 for(int i=2;i<=n;i++){ 35 int x=erfen(a[i])+1; 36 unset[x]=min(a[i],unset[x]); 37 } 38 for(int i=1;i<=n;i++)if(unset[i]!=INF)cnt=i; 39 cout<<n-cnt<<endl; 40 fclose(stdin);fclose(stdout); 41 return 0; 42 }hint:
不减i的话你看看这个数据1 2 3 2 2 2 2 4 5
减去i如果是不下降就说明那些在不下降序列上的数已经符合他们在数列中的位置,不需要修改了
以上是关于套题整理 Orz DXY的主要内容,如果未能解决你的问题,请参考以下文章