uva 1608 Non-boring sequences

解題思路:

不無聊的序列,這是劉汝佳紫書上的一道題,首先先找出一個獨一無二的數字,那麼只要跨越了這個數字的序列就是不無聊的,這個時候,再去找這個數字左邊的序列和這個數字右邊的序列,看是否是無聊的

代碼:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>

using namespace std;

const int MAX = 200010;

int N,T;
int a[MAX],l[MAX],r[MAX];

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(void)
{
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        for(int i = 0; i < N; ++i)
            scanf("%d",&a[i]);
        map<int, int> M;
        for(int i = 0; i < N; ++i){
            if(!M.count(a[i])) l[i] = -1;
            else l[i] = M[a[i]];
            M[a[i]] = i;
        }
        M.clear();
        for(int i = N - 1; i >= 0; --i){
            if(!M.count(a[i])) r[i] = N;
            else r[i] = M[a[i]];
            M[a[i]] = i;
        }
        if(solve(0,N-1))
            puts("non-boring");
        else
            puts("boring");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章