题目:
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; }