标签:inline arch 描述 bit 子序列 line out 输出 mem
Incr incr
数列 A1,A2,...,AN,修改最少的数字,使得数列严格单调递增。
第 1 行,1 个整数 N
第 2 行,N 个整数 A1,A2,...,AN
1 个整数,表示最少修改的数字
3
1 3 2
1
时间:1s 空间:256M
对于 50% 的数据,N<=10^3
对于 100% 的数据,1<=N<=10^5, 1<=Ai<=10^9
这题mmp思路只有出题人能想的出来……laj今天虽然是rk1但是laj比别人迟10min交,为什么呢?因为laj把很多时间耗在了这一题上(悄咪咪的说其实laj是第二题没想粗来所以滚去想第一题了 _(:зゝ∠)_)
思路:把原数列的第i位减掉i,然后拿n减掉最长单调不下降子序列的长度 _(:зゝ∠)_
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=1e5+5; 5 int n; 6 int a[MAX],b[MAX],len; 7 inline int read(){ 8 int an=0,x=1;char c=getchar(); 9 while (c<‘0‘ || c>‘9‘) {if (c==‘-‘) x=-1;c=getchar();} 10 while (c>=‘0‘ && c<=‘9‘) {an=an*10+c-‘0‘;c=getchar();} 11 return an*x; 12 } 13 int search(int x){ 14 int low=1,high,mid; high=len; 15 while (low<=high){ 16 mid=(low+high)>>1; 17 if (b[mid]>x) high=mid-1; 18 else low=mid+1; 19 } 20 return low; 21 } 22 int main(){ 23 freopen ("incr.in","r",stdin); 24 freopen ("incr.out","w",stdout); 25 int i,j,zt; 26 n=read(); 27 for (i=1;i<=n;i++) a[i]=read()-i; 28 memset(b,0,sizeof(b)); 29 len=1;b[1]=a[1]; 30 for (i=2;i<=n;i++){ 31 zt=search(a[i]); 32 if (zt>len) len++; 33 b[zt]=a[i]; 34 } 35 printf("%d",n-len); 36 return 0; 37 }
标签:inline arch 描述 bit 子序列 line out 输出 mem
原文地址:http://www.cnblogs.com/keximeiruguo/p/7689357.html