分治法的应用,,在使用分治法之前进行数据的挖掘,,,想到分治法了,,但是对于分治后面的应用还是不会,,如何在题目上进行递归,如何完成分治,,在分治的条件的判断都是我需要处理的,在分治时,,非常重要的是如何对分块进行处理,,重要的还有关于map函数的应用,目前都是需要掌握的,,
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
#define maxn 200000+5
int s[maxn];
int pre[maxn];
int nex[maxn];
map<int,int>ma;
int n;
bool isone(int pos,int l,int r)
{
return pre[pos]<l&&nex[pos]>r;
}
bool check(int l,int r)
{
if(l>=r)//递归的结束条件,,
{
return true;
}
for(int d=0;l+d<=r-d;d++)//这里是非常重要的,,在这里我们需要枚举每一个没有重复的数字
{
if(isone(l+d,l,r))
return check(l,l+d-1)&&check(l+d+1,r);//返回值
if(l+d==r-d)//这也是一个不合结果的答案,,因为在前面d个都在r-l里面,,也就是说这里面不会没有重复的数字
return 0;
if(isone(r-d,l,r))
return check(l,r-d-1)&&check(r-d+1,r);
}
return false;
}
int main()
{
int t;
// freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ma.clear();
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
if(!ma.count(s[i]))//判断前面是否存在刚刚输入的点,没有则赋值为-1
{
pre[i]=-1;
ma[s[i]]=i;//将这个值进入map中,,
}
else
{
pre[i]=ma[s[i]];
ma[s[i]]=i;
}
}
ma.clear();
for(int i=n;i>=1;i--)
{
if(!ma.count(s[i]))
{
nex[i]=n+1;
ma[s[i]]=i;
}
else
{
nex[i]=ma[s[i]];
ma[s[i]]=i;
}
}
int flag=0;
for(int i=2;i<=n;i++)
{
if(s[i]==s[i-1])
flag=1;
}
if(flag){
printf("boring\n");
continue;
}
if(check(1,n))
{
printf("non-boring\n");
continue;
}
else
printf("boring\n");
}
return 0;
}