2017 ACM/ICPC Asia Regional Shenyang Online array

来源:互联网 发布:js库有哪些 编辑:程序博客网 时间:2024/06/10 00:42

原题链接: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;}


阅读全文
0 0