UVA

来源:互联网 发布:java删除文件失败 编辑:程序博客网 时间:2024/05/16 08:18

We were afraid of making this problem statement too boring, so we decided to keep it short. A sequence
is called non-boring if its every connected subsequence contains a unique element, i.e. an element such
that no other element of that subsequence has the same value.
Given a sequence of integers, decide whether it is non-boring.

Input

The first line of the input contains the number of test cases T. The descriptions of the test cases follow:
Each test case starts with an integer n (1 ≤ n ≤ 200000) denoting the length of the sequence. In
the next line the n elements of the sequence follow, separated with single spaces. The elements are
non-negative integers less than 109.

Output

Print the answers to the test cases in the order in which they appear in the input. For each test case
print a single line containing the word ‘non-boring’ or ‘boring’.

Sample Input

4
5
1 2 3 4 5
5
1 1 1 1 1
5
1 2 3 2 1
5
1 1 2 1 1

Sample Output

non-boring
boring
non-boring
boring

一组数列,如果其中有一个数字只出现过一次,则可以判定它是non-boring的。
先找出母序列中唯一的数,它在母序列中是唯一的,那么在子序列中也是唯一的,则所有跨过它的子序列也都是non-boring的,不用判断,所以可以递归查找数字两边的子序列,直到查到长度为1则可以返回true。
那么如何判断这个数在序列中是唯一的?可以在读入的时候记录这个数字上一次出现和下一次出现的位置,判断是否在数列的范围内即可。

#include <stdio.h>#include <map>using namespace std;int l[200015],r[200015],a[200015];bool sss(int x,int y){    if(x>=y){        return true;    }    for(int i=0;i<=(y-x)/2;i++){        if(l[x+i]<x && r[x+i]>y){            return sss(x,x+i-1) && sss(x+i+1,y);        }        if(l[y-i]<x&&r[y-i]>y){            return sss(x,y-i-1) && sss(y-i+1,y);        }    }    return false;}int main(){    int T,n,i,j,k;    scanf("%d",&T);    while(T--){        map<int,int> m;        scanf("%d",&n);        for(i=0;i<n;i++){            scanf("%d",&a[i]);        }        for(i=0;i<n;i++){            if(!m.count(a[i])){                l[i]=-1;            }else{                l[i]=m[a[i]];            }            m[a[i]]=i;        }        m.clear();        for(i=n-1;i>=0;i--){            if(!m.count(a[i])){                r[i]=n;            }else{                r[i]=m[a[i]];            }            m[a[i]]=i;        }        m.clear();        if(sss(0,n-1)){            printf("non-boring\n");        }else{            printf("boring\n");        }    }    return 0;}
原创粉丝点击