zoukankan      html  css  js  c++  java
  • Uva1608

    如果一个序列的所有子序列中均存在至少一个元素,这个元素在该子序列中只出现一次,则这个序列non-boring。

    当一个序列[x,y]中没有元素只出现一次,那么该序列不符合要求,如果有的话,设为第i个元素,则 只要[x,i-1]和 [i+1,n] 符合要求,则该序列符合要求。

    在O(N)的时间内预处理一个元素左右离它最近的相同元素的位置,即可在O(1)时间内查询是否这个元素在给定序列中只出现一次。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 const int inf = 0x3f3f3f3f;
     6 
     7 const int maxn = 200000;
     8 
     9 int t;
    10 
    11 int a[maxn+10];
    12 
    13 int lef[maxn+10];
    14 
    15 int rgt[maxn+10];
    16 
    17 map<int, int> ml, mr;
    18 
    19 bool judge(int i, int x, int y){
    20         if(lef[i] < x && rgt[i] > y){
    21             //printf("%d %d %d
    ",i,lef[i],rgt[i]);
    22             return 1;
    23         } else {
    24             return 0;
    25         }
    26 }
    27 
    28 bool dfs(int x, int y){
    29     if(x >= y){
    30         return 1;
    31     }
    32     if(x + 1  == y){
    33         return a[x] != a[y];
    34     }
    35     int res = 0;
    36     for(int i = x, j = y; i <= j ; ++i, --j){
    37                 if(judge(i, x, y)){
    38                 //    printf("dsadsa:%d %d %d
    ",i,x,y);
    39                     res = dfs(x, i-1) && dfs(i+1, y);
    40                 } else if(judge(j, x, y)){
    41                 //    printf("AAAAAA:%d %d %d
    ",j,x,y);
    42                     res = dfs(x,j-1) && dfs(j+1, y);
    43                 }
    44                 if(res == 1){
    45                     return 1;
    46                 }
    47     }
    48     return 0;
    49 }
    50 
    51 void init(){
    52     ml.clear();
    53     mr.clear();
    54 }
    55 
    56 int main(){
    57         scanf("%d",&t);
    58         while(t--){
    59             init();
    60             int n;
    61             scanf("%d",&n);
    62             for(int i = 1; i <= n; ++i){
    63                 scanf("%d",&a[i]);
    64                 lef[i] = 0;
    65                 rgt[i] = inf;
    66             }
    67 
    68             for(int i = 1, j = n; i <= n && j >= 1; ++i,--j){
    69                     int tmp = ml[a[i]];
    70                     int tmp1 = mr[a[j]];
    71                      if(tmp){
    72                         lef[i] = tmp;
    73                     }
    74                     ml[a[i]] = i;
    75                     if(tmp1){
    76                         rgt[j] = tmp1;
    77                     }
    78                     mr[a[j]] = j;
    79             }
    80 
    81             int ans = dfs(1,n);
    82             if(ans == 0){
    83                 printf("boring
    ");
    84             } else {
    85                 printf("non-boring
    ");
    86             }
    87             
    88         }
    89 }
  • 相关阅读:
    echarts 柱状图
    echarts 双y轴渐变色进度条
    echarts 折线图
    算法系列一:本质以及特征
    导致薪水低的九大行为表现
    Tomcat使用shutdown.sh无法关闭
    定时将上月的数据导入到Oracle中,并更新指定的列
    定时抛转数据 crontab
    微服务主要模块
    tk.mybatis 调用oracle,生成ID
  • 原文地址:https://www.cnblogs.com/GeniusYang/p/6876215.html
Copyright © 2011-2022 走看看