uva1608 Non-boring sequences

某个序列找到唯一元素后,判断被分成的两边的序列即可
问题在于找到唯一元素
连续序列,重复元素的问题;感觉很有一般性 查找相同元素用map,last,next存上一个相同元素的位置
复杂度计算有点思考;
记录last,next,那么对于一个元素,判断是否独立O(1)
从头开始查找,最坏情况T(n)=T(n-1)+O(n)(O(n)是从头判断到尾) =O(n^2)
两边开始T(n)=2T(n/2)+O(n)=T(nlogn)

#include<cstdio>
#include<map>
using namespace std;

const int maxn = 200000 + 5;
int A[maxn], last[maxn], nextp[maxn];
map<int, int> cur;

bool duli(int p, int L, int R) {
  return last[p] < L && nextp[p] > R;
}

bool check(int L, int R) {
  if(L >= R) return true;
  for(int d = 0; L+d <= R-d; d++) {
    if(duli(L+d, L, R))                        //L+d位置上的元素 独立
      return check(L, L+d-1) && check(L+d+1, R);
    if(L+d == R-d) break;
    if(duli(R-d, L, R))
      return check(R-d+1, R) && check(L, R-d-1);
  }
  return false;
}

int main() {
  int T, n;
  scanf("%d", &T);
  while(T--) {
    scanf("%d", &n);
    cur.clear();
    for(int i = 0; i < n; i++) {
      scanf("%d", &A[i]);
      if(!cur.count(A[i]))
        last[i] = -1;
      else
        last[i] = cur[A[i]];
      cur[A[i]] = i;
    }
    cur.clear();
    for(int i = n-1; i >= 0; i--) {
      if(!cur.count(A[i]))
        nextp[i] = n;
      else
      nextp[i] = cur[A[i]];
      cur[A[i]] = i;
    }

    if(check(0, n-1))
        printf("non-boring
");
    else
        printf("boring
");
  }
  return 0;
}
原文地址:https://www.cnblogs.com/lqerio/p/9745538.html