2018TYUT暑期ACM模拟赛(3)
​​​array array array HDU - 6197 ​​​
题意:给n,k,代表有n个数,可以最多有k次消除。使得最后的数字是上升的序列或者是下降的序列。
思路:这道题的另一个意思就是求,n个数的最长上升序列和最长下降序列。判断是否有一个可以满足 k >=(n-最长的长度)。
AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int dp[maxn];
int pd[maxn];
int a[maxn];
int b[maxn];
const int inf= 0x7f7f7f7f;
//zuichang

int main()
{
int t;
int n,k;
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
dp[i]=inf;
pd[i]=inf;
}
for(int i=n-1;i>=0;i--)
b[n-i-1]=a[i];

for(int i=0;i<n;i++)
*lower_bound(dp,dp+n,a[i])=a[i];//找到>=a[i]的第一个元素,并用a[i]替换;
for(int i=0;i<n;i++)
*lower_bound(pd,pd+n,b[i])=b[i];//找到<=a[i]的第一个元素,并用b[i]替换;
int ans1=lower_bound(dp,dp+n,inf)-dp;
int ans2=lower_bound(pd,pd+n,inf)-pd;
//cout<<ans1<<" "<<ans2<<endl;
if((k>=n-ans1)||(k>=n-ans2)) cout<<"A is a magic array."<<endl;
else cout<<"A is not a magic array."<<endl;
}

return 0;
}