您的位置:首页 > 产品设计 > UI/UE

分治法,中途相遇法(Non-boring sequences,uva 1608)

2016-09-13 21:43 447 查看
分治法很容易想到。

中途相遇法真是个神奇的东西。

意思大概就是,你可以从两边出发去寻找答案,然而无论你从那一边出发,随着寻找的次数逐渐增多,枚举量飞速增长,因此你不如从两边一起找,这样两边的枚举量都能显著控制在较低水平,从而提高程序效率。

感觉在uva超时了就很有可能是数组越界了。。。

代码

#include<bits/stdc++.h>
#define maxn 200010
#define INF 0X3F3F3F3F
using namespace std;

int n;
int a[maxn];
int l[maxn];
int r[maxn];
map<int,int>lastl;
map<int,int>lastr;

bool br(int L,int R)
{
if(L>=R) return true;
int i=L;
int j=R;
while(i<=j)
{
if(l[i]<L&&r[i]>R) return br(L,i-1)&&br(i+1,R);
if(l[j]<L&&r[j]>R) return br(L,j-1)&&br(j+1,R);
i++;
j--;
}
return false;
}

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
lastl.clear();
lastr.clear();
for(int i=1,j=n;i<=n;i++,j--)
{
if(lastl[a[i]]==0) l[i]=-1;
else l[i]=lastl[a[i]];
lastl[a[i]]=i;
if(lastr[a[j]]==0) r[j]=INF;
else r[j]=lastr[a[j]];
lastr[a[j]]=j;
}
if(br(1,n)) puts("non-boring");
else puts("boring");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: