UVA 1608(集训比赛2B_E题)解题报告

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4483

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

题意:如果对于任意子序列,都存在一个独一无二的数,称之为"non-boring",反之"boring"

思路:每次从大的序列中找一个唯一元素,包含这个元素的就不用判断了,那么以这个元素为分界线,在分别判断两边的序列。递归+分治

代码:

 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define INF 0X3F3F3F3F  
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int MAXN =2e5+10;
int n;  
int a[MAXN];  
int l[MAXN];  
int r[MAXN];  
map<int,int>lastl;  
map<int,int>lastr;  
  
int jud(int L,int R)  
{  
    if(L>=R) return 1;  
    int i=L;  
    int j=R;  
    while(i<=j)  
    {  
        if(l[i]<L&&r[i]>R) return jud(L,i-1)&&jud(i+1,R);  
        if(l[j]<L&&r[j]>R) return jud(L,j-1)&&jud(j+1,R);  
        i++;  
        j--;  
    }  
    return 0;  
}  
  
int main()  
{  
    int T;  
    scanf("%d",&T);  
    for(int k=0;k<T;k++){  
        scanf("%d",&n);  
        lastl.clear();  
        lastr.clear(); 
        for(int i=1;i<=n;i++)  {
            scanf("%d",&a[i]);
        }  
        for(int i=1,j=n;i<=n;i++,j--)  
        {  
            if(lastl[a[i]]==0) l[i]=-1;  
            else l[i]=lastl[a[i]];  
            lastl[a[i]]=i;  
            if(lastr[a[j]]==0) r[j]=INF;  
            else r[j]=lastr[a[j]];  
            lastr[a[j]]=j;  
        }  
        if(jud(1,n)) printf("non-boring\n");  
        else printf("boring\n");  
    }  
    return 0;  
}  
View Code

 

posted @ 2018-01-26 23:57  caomp  阅读(115)  评论(0)    收藏  举报