原题链接:https://vjudge.net/problem/UVA-1608
分类:分治法
备注:中途相遇法的思路
这个题从中间往两头找也是不行的,必须两头往中间找。
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=200000+5;
int L[maxn],R[maxn],a[maxn],n,t;
map<int,int>pos;
bool dfs(int l,int r){
if(l>=r)return true;
int mid=(l+r)>>1;
for(int i=l,j=r;i<=mid||j>=mid+1;i++,j--){
if(i<=mid&&L[i]<l&&R[i]>r){
return dfs(l,i-1)&&dfs(i+1,r);
}
if(j>=mid+1&&L[j]<l&&R[j]>r){
return dfs(l,j-1)&&dfs(j+1,r);
}
}
return false;
}
int main(void){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&t);
while(t--){
scanf("%d",&n);
pos.clear();
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
L[i]=0,R[i]=inf;
if(pos.count(a[i])){
L[i]=pos[a[i]];
R[pos[a[i]]]=i;
}
pos[a[i]]=i;
}
printf("%s\n",dfs(1,n)?"non-boring":"boring");
}
return 0;
}