题目:
题意:
一个数列是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;
}