2015 Changchun F

来源:互联网 发布:数控编程教学视频 编辑:程序博客网 时间:2024/05/20 09:06

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5532

题目大意:

给一个序列,判断是否是Almost Sorted Array,即去掉一个数后剩余序列是非严格单调序列。

这是一个LIS啊LIS。。。

只要求出LIS的长度=n-1,那么这个序列就是Almost Sorted Array,否则必然不是

签到题都是DP,区域赛的恶意。。

#include<stdio.h>#include<math.h>#include<algorithm>#include<iostream>#include<queue>using namespace std;const int MAXN=1<<17;int d[MAXN];int re[MAXN];int main(){int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&d[i]);int cur=0;re[++cur]=d[0];//升序LDSfor(int i=1;i<n;i++){if(d[i]>=re[cur])re[++cur]=d[i];elseif(d[i]<re[1])re[1]=d[i];else{int left,right;left=1;right=cur;while(left<right-1){int mid=(left+right)/2;if(re[mid]<=d[i])left=mid;elseright=mid;}if(d[i]<=re[right])re[right]=d[i];elsere[left]=d[i];}}if(cur>=n-1){printf("YES\n");continue;}//降序LIS cur=0;        re[++cur]=d[n-1];        for(int i=n-2;i>=0;i--){            if(d[i]>=re[cur])  re[++cur]=d[i];            else if(d[i]<re[1])   re[1]=d[i];            else{                int left, right;                left=1;right=cur;                while(left<right-1){                    int mid=(left+right)/2;                    if(re[mid]<=d[i])  left=mid;                    else    right=mid;                }                if(d[i]<=re[right])  re[right]=d[i];                else re[left]=d[i];            }        }        if(cur>=n-1){            printf("YES\n");            continue;        }        else{            printf("NO\n");        }}return 0;}


0 0
原创粉丝点击