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

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

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

 #include <bits/stdc++.h>

 using namespace std;

 const int inf = 0x3f3f3f3f;

 const int maxn = ;

 int t;

 int a[maxn+];

 int lef[maxn+];

 int rgt[maxn+];

 map<int, int> ml, mr;

 bool judge(int i, int x, int y){
if(lef[i] < x && rgt[i] > y){
//printf("%d %d %d\n",i,lef[i],rgt[i]);
return ;
} else {
return ;
}
} bool dfs(int x, int y){
if(x >= y){
return ;
}
if(x + == y){
return a[x] != a[y];
}
int res = ;
for(int i = x, j = y; i <= j ; ++i, --j){
if(judge(i, x, y)){
// printf("dsadsa:%d %d %d\n",i,x,y);
res = dfs(x, i-) && dfs(i+, y);
} else if(judge(j, x, y)){
// printf("AAAAAA:%d %d %d\n",j,x,y);
res = dfs(x,j-) && dfs(j+, y);
}
if(res == ){
return ;
}
}
return ;
} void init(){
ml.clear();
mr.clear();
} int main(){
scanf("%d",&t);
while(t--){
init();
int n;
scanf("%d",&n);
for(int i = ; i <= n; ++i){
scanf("%d",&a[i]);
lef[i] = ;
rgt[i] = inf;
} for(int i = , j = n; i <= n && j >= ; ++i,--j){
int tmp = ml[a[i]];
int tmp1 = mr[a[j]];
if(tmp){
lef[i] = tmp;
}
ml[a[i]] = i;
if(tmp1){
rgt[j] = tmp1;
}
mr[a[j]] = j;
} int ans = dfs(,n);
if(ans == ){
printf("boring\n");
} else {
printf("non-boring\n");
} }
}

Uva1608的更多相关文章

  1. UVa1608 UVaLive6258 Non-boring sequences

    填坑系列(p.248) 比较神 从两端枚举 最坏复杂度就成O(nlogn)了 #include<cstdio> #include<cstdlib> #include<al ...

  2. 8-16 不无聊序列 non-boring sequences uva1608

    题意: 如果一个序列的任意连续子序列中至少有一个只出现一次的元素  则称这个序列是 不无聊序列  输入一个n个元素的序列a   判断是不是不无聊序列 一开始想当然  以为只要 2位的子序列都满足即可 ...

  3. uva1608 Non-boring sequences

    某个序列找到唯一元素后,判断被分成的两边的序列即可问题在于找到唯一元素连续序列,重复元素的问题:感觉很有一般性 查找相同元素用map,last,next存上一个相同元素的位置复杂度计算有点思考:记录l ...

  4. UVA-1608

    We were afraid of making this problem statement too boring, so we decided to keep it short. A sequen ...

  5. 题解 UVA1608 【不无聊的序列 Non-boring sequences】

    思路: 算法很显然: 一.在区间\([l,r]\)找到一个只出现一次的元素P(如果不存在,那么序列\(boring\)) 二.递归处理区间\([l,p-1]\)和区间\([p+1,r]\). 其关键在 ...

  6. ●UVA 1608 Non-boring sequences

    题链: https://vjudge.net/problem/UVA-1608#author=chenchonghan题解: 分治 如果一个区间[l,r]里面在p位置出现了一个只出现一次的元素,(如果 ...

随机推荐

  1. ES+open-falcon之报警自动发送请求信息

    当我们监控nginx的状态码出现错误状态码的时候, 一般的处理方法是通过kibana查询是哪个接口导致从而确定是哪个服务,再进一步登录业务机器查询业务日志确定原因. 我们现在要做的事情就是将 人为的通 ...

  2. http头部解释

    If-Modified-Since,If-Node-Match,ETag,Last-Modified 1 属于 Request Headers的是:If-Modified-Since,If-Node- ...

  3. 用遗传算法解决TSP问题

    浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(小m\)在踏上寻找\(小o\)的路程之后不小心碰到了大魔王\(fat ...

  4. flume 配置与使用

    1.下载flume,解压到自建文件夹 2.修改flume-env.sh文件 在文件中添加JAVA_HOME 3.修改flume.conf 文件(原名好像不叫这个,我自己把模板名改了) 里面我自己配的( ...

  5. Nginx正则表达式之匹配操作符详解

    nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能.例如:防止rewrite.盗链.对静态资源设置缓存以及浏览器限制等等.由于nginx配置中有if指令,但是没有对应else指令,所以 ...

  6. java基础知识(2)---语法基础

    二:java语法基础: 1,关键字:其实就是某种语言赋予了特殊含义的单词. 保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单词. 2,标示符:其实就是在程序中自定义的名词.比如类名,变量名 ...

  7. Nios程序烧写到EPCS方法 - 第1页 - asus119's Blog - EDN China电子设计技术

    Nios程序烧写到EPCS方法 - 第1页 - asus119's Blog - EDN China电子设计技术 这里主要是针对EP3C系列FPGA的Nios程序固化到EPCS中的方法做简要说明.硬件 ...

  8. 0010_while循环

    while 条件: 代码块 break:跳出循环语句 continue:跳出本次循环,进入下一次循环. __author__ = 'qq593' #!/usr/bin/env python #-*- ...

  9. [dp]LCS最长公共子序列

    https://www.51nod.com/tutorial/course.html#!courseId=4 复杂度:${\rm O}(nm)$ 转移方程: #include<bits/stdc ...

  10. byte和int转换

    byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2); System.out.println(b3+b6); b3=b1+b ...