题意:一个序列任意连续子序列中至少有一个只出现一次的元素,则称这个序列是non-boring的。
分析:任意连续子序列至少有一个只出现一次的元素。order序列中找到出现一次的元素,然后从这个元素前半部分和后半部分找non-boring序列。依次递归。
还有一种不知道可不可行,就是找重复在一起的相同元素。比如 1 2 3 3 4只需要找到3这个连续重复的元素就可以认为是boring的。
#include<cstdio>
#include<map>
using namespace std;
const int maxn = 200000 + 5;
int A[maxn], prev[maxn], next[maxn];
map<int, int> cur;
inline bool unique(int p, int L, int R) {
return prev[p] < L && next[p] > R;
}
bool check(int L, int R) {
if(L >= R) return true;
for(int d = 0; L+d <= R-d; d++) {
if(unique(L+d, L, R))
return check(L, L+d-1) && check(L+d+1, R);
if(L+d == R-d) break;
if(unique(R-d, L, R))
return check(R-d+1, R) && check(L, R-d-1);
}
return false;
}
int main() {
int T, n;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
cur.clear();
for(int i = 0; i < n; i++) {
scanf("%d", &A[i]);
if(!cur.count(A[i])) prev[i] = -1;
else prev[i] = cur[A[i]];
cur[A[i]] = i;
}
cur.clear();
for(int i = n-1; i >= 0; i--) {
if(!cur.count(A[i])) next[i] = n;
else next[i] = cur[A[i]];
cur[A[i]] = i;
}
if(check(0, n-1)) printf("non-boring\n");
else printf("boring\n");
}
return 0;
}