2015ACM/ICPC亚洲区长春站 HDU 5532

题意:删除一个数字之后,剩下的数列是非递增或非递减。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=1e5+10;
int a[maxm];
int n;
int ok;
void judge1()
{
    int num=0;
    int k;
    for(int i=1;i<n;i++)
    {
        if(a[i]<a[i-1])
        {
            num++;
            k=i;
        }
    }
    if(num==0)
        ok=1;
    else if(num==1)
    {
        //这些情况的例子 3 1 1 2 3   /*******/   1 2 4 3 4    /*********/    1 1 2 1 1 4    /*****/  1 2 3 4 3
        if(k==1||k==n-1||a[k-1]<=a[k+1]||a[k-2]<=a[k])
        {
            ok=1;
        }
    }
}
void judge2()
{
    int num=0;
    int k;
    for(int i=1;i<n;i++)
    {
        if(a[i]>a[i-1])
        {
            num++;
            k=i;
        }
    }
    if(num==0)
        ok=1;
    else if(num==1)
    {
        if(k==1||k==n-1||a[k-1]>=a[k+1]||a[k-2]>=a[k])
        {
            ok=1;
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        ok=0;
        judge1();
        if(ok)
        {
            printf("YES\n");
            continue;
        }
        judge2();
        if(ok)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}


//正着找一个最长不下降L1,反正找一个最长不下降(正着就是最长不递减)L2,如L1==N||L1==N-1||L2==N||L2==N-1的话,证明可以YES,不然NO
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=1e5+10;
int a[maxm];
int b[maxm];
int dp1[maxm];
int dp2[maxm];
int n;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int i;
        int temp1,temp2;
        for(i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            b[n-i+1]=a[i];
        }
        dp1[1]=a[1];
        dp2[1]=b[1];
        int len1=1;
        int len2=1;
        for(i=2; i<=n; i++)
        {
            if(dp1[len1]<=a[i])//最长不下降
            {
                dp1[++len1]=a[i];
            }
            else
            {
                temp1=upper_bound(dp1+1,dp1+len1+1,a[i])-dp1;
                dp1[temp1]=a[i];
            }
        }
        for(i=2; i<=n; i++)
        {
            if(dp2[len2]<=b[i])//反找最长不下降
            {
                dp2[++len2]=b[i];
            }
            else
            {
                temp2=upper_bound(dp2+1,dp2+len2+1,b[i])-dp2;
                dp2[temp2]=b[i];
            }
        }
        if(len1==n-1||len2==n-1||len1==n||len2==n)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}


你可能感兴趣的:(2015ACM/ICPC亚洲区长春站 HDU 5532)