zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    SQL中常用的数据类型及简介
    静态方法与非静态方法
    遍历多维数组
    遍历一个三维数组
    冒泡排序-方法2
    关于二分查找分
    冒泡排列-——方法1
    AngularJS 循环查询数组
    AngularJs 指令
    给定一个年月值,返回上个年月值,格式为:YYYY.MM string类型
  • 原文地址:https://www.cnblogs.com/lqerio/p/9745538.html
Copyright © 2011-2022 走看看