hdu 6197 array array array
题意:给出n,k,长度为n的数列,问是否可以删除k个使得整个数列变成递增的数列或者递减的,不是严格的(即可以为 1 3 3 4)
思路:我们求个最长的递增子序列,看是不是n-k<=(最长子序列),反之亦然
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 6 int a[N]; 7 int dp[N]; 8 int main() 9 { 10 int t; 11 cin>>t; 12 while(t--) 13 { 14 int n,k; 15 scanf("%d%d",&n,&k); 16 for(int i=1; i<=n; i++) 17 { 18 scanf("%d",&a[i]); 19 } 20 memset(dp,127,sizeof(dp)); 21 int l2=0; 22 for(int i=1; i<=n; i++) 23 { 24 int kk=upper_bound(dp+1,dp+1+n,a[i])-dp; 25 l2=max(l2,kk); 26 dp[kk]=a[i]; 27 } 28 if(n-k<=l2){ 29 cout<<"A is a magic array."<<endl;continue; 30 } 31 memset(dp,127,sizeof(dp)); 32 int r2=0; 33 for(int i=n;i>=1;i--) 34 { 35 int kk=upper_bound(dp+1,dp+1+n,a[i])-dp; 36 r2=max(r2,kk); 37 dp[kk]=a[i]; 38 } 39 if(n-k<=r2){ 40 cout<<"A is a magic array."<<endl;continue; 41 } 42 cout<<"A is not a magic array."<<endl; 43 } 44 }