1. 程式人生 > >【高效演算法設計——遞迴】 UVa 1608 Non-boring sequences

【高效演算法設計——遞迴】 UVa 1608 Non-boring sequences

題意:給定一段序列,如果這段序列的任意連續子序列中至少存在一個數唯一,那麼這段序列就是Non-boring,否則就是boring,判定這段序列是否boring

思路:如果一個數A[x]是全場唯一,那麼我們只需判斷A[1]~A[x-1] 和A[x+1]~A[n]是否滿足要求,為什麼呢?因為A[x]全場唯一,所以經過A[x]的連續欄位必然是Non-boring的,所以我們可以設計一個遞迴函式bool isBor(int l,int r)判斷區間l~r是不是boring的,並且,我們還需要通過map的方式預處理每個序列左邊和右邊離他最近的相同距離的下標

遞迴的時候為了保證效率,我們從中間開始尋找唯一序列,程式碼如下:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
using namespace std;

const int maxn=200000+5;

int L[maxn],R[maxn],A[maxn];
int n;
map<int,int>MAP; 


inline bool get(int &t)
{
    bool flag = 0 ;
    char c;
    while(!isdigit(c = getchar())&&c!='-') if( c == -1 ) break ;
    if( c == -1 ) return 0 ;
    if(c=='-') flag = 1 , t = 0 ;
    else t = c ^ 48;
    while(isdigit(c = getchar()))    t = (t << 1) + (t << 3) + (c ^ 48) ;
    if(flag) t = -t ;
    return 1 ;
}

bool solve(int left, int right)
{
    if(left >= right)
        return true;
    for(int i = 0; i <= (right - left) / 2; ++i){
        if(L[left + i] < left && R[left + i] > right)
            return solve(left, left + i - 1) && solve(left + i + 1,right);
        if(L[right - i] < left && R[right - i] > right)
            return solve(left,right - i - 1) && solve(right - i + 1, right);
    }
    return false;
}

int main()
{
    int i,j;
    int T;
    scanf("%d",&T);

    while(T--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
            get(A[i]);
		  // scanf("%d",&A[i]);

     //  memset(L,-1,sizeof L);
	 //  memset(R,0x3f,sizeof R);
		
		MAP.clear();	
        for(i=0;i<n;i++)
        {
            if(MAP.find(A[i])!=MAP.end())
            {
                L[i]=MAP[A[i]];
            }
			else
				L[i]=-1;
            MAP[A[i]]=i;
        }


        MAP.clear();
        for(i=n-1;i>=0;i--)
        {
            if(MAP.find(A[i])!=MAP.end())
            {
                R[i]=MAP[A[i]];
            }
			else
				R[i]=n;
            MAP[A[i]]=i;
        }

        if(solve(0,n-1))
        {
            puts("non-boring");
        }
        else
        {
            puts("boring");
        }

    }

    return 0;
}