原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6197
题目大意:给出一个序列,删去k个元素是否能构成不上升序列或不下降子序列
(呃,先凑个数吧
二分+单调栈跑出最长不上升子序列长度和最长不下降子序列长度,如果超过n-k则能构成,否则不能。
代码:
#include <bits/stdc++.h>
using namespace std;
inline void read(int &x){
char ch;
bool flag=false;
for (ch=getchar();!isdigit(ch);ch=getchar())if (ch=='-') flag=true;
for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
x=flag?-x:x;
}
inline void read(long long &x){
char ch;
bool flag=false;
for (ch=getchar();!isdigit(ch);ch=getchar())if (ch=='-') flag=true;
for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
x=flag?-x:x;
}
int const maxn=200000;
int d[maxn],top;
int a[maxn];
int n,lim;
int getnum(int x){
int l=1,r=top;
int ans=0;
while (l<=r)
{
int mid=(l+r)/2;
if ( d[ mid ] <= x)
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
return ans;
}
void doit(){
read(n);read(lim);
top=0;
for (int i=1;i<=n;i++)
read(a[i]);
for (int i=1;i<=n;i++)
{
int tmp= getnum(a[i]);
d[ ++tmp ]=a[i];
if ( tmp >top )
top=tmp;
}
if ( top>= n - lim )
{
puts("A is a magic array.");
return ;
}
top=0;
for (int i=1;i<=n;i++)
a[i]=-a[i];
for (int i=1;i<=n;i++)
{
int tmp= getnum(a[i]);
d[ ++tmp ]=a[i];
if ( tmp >top )
top=tmp;
}
if ( top>= n - lim )
{
puts("A is a magic array.");
return ;
}
puts("A is not a magic array.");
}
int main(){
int T;
read(T);
for (int i=1;i<=T;i++)
doit();
return 0;
}