如果一个序列的所有子序列中均存在至少一个元素,这个元素在该子序列中只出现一次,则这个序列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. [转]WebKit CSS3 动画基础

    前几天在Qzone上看到css3动画,非常神奇,所以也学习了一下.首先看看效果http://www.css88.com/demo/css3_Animation/ 很悲剧的是css3动画现在只有WebK ...

  2. RS485总线防雷保护方案

    RS485作为最为最常用的电表通讯方式之一.日常生活中雷电和静电干扰已经成为485通信总线在实际工程经常遇到的问题.故如何对芯片以及总线进行有效的保护,是摆在每一个使用者面前的一个问题.在这里,我们主 ...

  3. shell入门-tr替换字符和split切割大文件

    命令:tr 说明:替换字符 格式tr ‘原字符’ ‘新字符’ 可以是范围字符,指定字符 命令:split 选项:-b 50m 1.txt  根据大小分割 单位是b不用单位,单位是兆加m -l 100 ...

  4. 关于RTC的浅学

    最近公司业务主要是移动客户端,所以免不了客户端与服务端之间的通信.第一次接触通信,做点基本概念的笔记. 主要架构是:openfire+xmpp+play+移动客户端,下文理下这几个概念. OpenFi ...

  5. PopupWindow-----listview item的点击出现PopupWindow

    /** * 设置listview item的点击事件 */ lv_app_manager.setOnItemClickListener(new OnItemClickListener() { @Ove ...

  6. 【总结整理】overflow: auto/hidden;清除自己

    .top-nav{ font-size: 12px; font-weight: bold; list-style-type: none; border-bottom: 8px solid #DC4E1 ...

  7. AngularJS中的DI

    AngularJS中的DI一直以为Angular中的DI是很高大上的东西,也自己写过一个DI的demo,知道其中的难点就是最后动态代码的执行:我现在知道了参数的值,也知道了我要执行的方法/创建对象的类 ...

  8. 【NLP】中文分词:原理及分词算法

    一.中文分词 词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键. ...

  9. POJ 3691 DNA repair (DP+字符串)

    题意:给出nn(1≤n≤50,1≤n≤50) 个病毒DNA序列,长度均不超过20.现在给出一个长度不超过1000的字符串,求至少要更换多少个字符, 才能使这个字符串不包含这些DNA序列. 析:利用前缀 ...

  10. CocoaPods常用操作命令

    查看镜像: gem sources -l 删除镜像 gem sources --remove https://rubygems.org/ 添加镜像 gem sources -a https://gem ...