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

来源:互联网 发布:php 读取文件夹 图片 编辑:程序博客网 时间:2024/05/17 06:51

分治法很容易想到。

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

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


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


代码

#include<bits/stdc++.h>#define maxn 200010#define INF 0X3F3F3F3Fusing 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;}


0 0
原创粉丝点击