题目:https://vjudge.net/problem/UVA-1608
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<queue>
#include<cmath>
#include<map>
#pragma warning(disable:4996)
using namespace std;
const int maxn = 200000 + 5;
map<int, int> cur;
int pre[maxn], nextt[maxn],a[maxn],n;
bool dfs(int L, int R)
{
if (L >= R) return true;
int mid;
int s = L, e = R;
while (s <= e)
{
if (pre[s] < L && nextt[s] > R)
{
mid = s;
break;
}
if (pre[e] < L && nextt[e] > R)
{
mid = e;
break;
}
s++; e--;
}
if (s > e) return false;
return dfs(L, mid - 1) && dfs(mid + 1, R);
}
int main() {
int kcase = 0;
cin >> kcase;
while (kcase--)
{
scanf("%d", &n);
cur.clear();
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if (!cur.count(a[i]))
{
pre[i] = -1;
}
else
{
pre[i] = cur[a[i]];
}
cur[a[i]] = i;
}
cur.clear();
for (int i = n - 1; i >= 0; i--)
{
if (!cur.count(a[i]))
{
nextt[i] = n;
}
else
{
nextt[i] = cur[a[i]];
}
cur[a[i]] = i;
}
if (dfs(0, n - 1))
cout << "non-boring\n";
else
cout << "boring\n";
}
return 0;
}