经典的dp正着来个最长上升子序列,反着来个最长上升子序列,结束
#include<bits\stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
int INF=1e9+7;
const int mod=1e9+7;
int n,m;
int x;
int g[100005],g1[100005],a[100005];
int main()
{
int t,k,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
int ans=0;
int ans1=0;
for(int i=1; i<=n; i++)g[i]=INF,g1[i]=INF;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
x=a[i];
y=a[n-i+1];
if(i==1)g[i]=x,g1[i]=y;
else
{
int j=lower_bound(g+1,g+1+n,x)-g;
int j1=lower_bound(g1+1,g1+1+n,y)-g1;
if(g[j]==x)j++;
if(g1[j1]==y)j1++;
g[j]=x;
g1[j1]=y;
ans=max(ans,j);
ans1=max(ans1,j1);
}
}
if(n-ans<=k||n-ans1<=k)
printf("A is a magic array.\n");
else
{
printf("A is not a magic array.\n");
}
}
return 0;
}