CERC2012 D - Non-boring sequences 暴力

              题目: 

                     Click here

              题意:

                     一个数列是non-boring只有其所有长度>1的子串中至少有一个数字仅出现了一次...长度可能会到2*10^5..现在给出若干的序列..请判断是否为non-boring序列...

              题解:

                     可以用O(nlogn)预处理..得到串中每一位数可以覆盖到的最左与最右(仅出现一次)...然后就是利用dfs..一层一层的判断了...

                     无语的是我在枚举终点的时候是从s~e..超时到吐..但标称用一种奇怪的顺序来枚举..居然2s不到就过了..Orz...


Program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<time.h>
#define ll long long
#define oo 1<<29
#define MAXN 200005
#define pi acos(-1.0)
#define esp 1e-30
using namespace std;     
struct node
{
       int w,id;
}A[MAXN];
int L[MAXN],R[MAXN];
bool F[MAXN];
bool judge(int s, int e) 
{
       int i,mid;
       if (s==e) return false;
       for (i=0;i<(e-s);i++) 
       {
             if (i%2) mid=s+i/2;
                else  mid=e-1-i/2; 
             if (L[mid]<s && R[mid]>e)
                 return judge(s,mid) || judge(mid+1,e);
       }
       return true;
}
bool cmp(node a,node b)
{
       if (a.w!=b.w) return a.w<b.w;
       else return a.id<b.id;
}
int main()
{    
       int cases,n,i,x; 
       scanf("%d",&cases);  
       while (cases--)
       {   
               scanf("%d",&n);
               for (i=1;i<=n;i++) scanf("%d",&A[i].w),A[i].id=i;
               sort(A+1,A+1+n,cmp),A[n+1].w=A[0].w=-1;
               for (i=1;i<=n;i++)
               { 
                      x=A[i].id;
                      L[x]=0,R[x]=n+1;
                      if (A[i-1].w==A[i].w) L[x]=A[i-1].id;
                      if (A[i+1].w==A[i].w) R[x]=A[i+1].id;
               }
               if (!judge(1,n)) printf("non-boring\n");
                          else  printf("boring\n"); 
       }    
       return 0;
}


你可能感兴趣的:(CERC2012 D - Non-boring sequences 暴力)