Uva1608
如果一个序列的所有子序列中均存在至少一个元素,这个元素在该子序列中只出现一次,则这个序列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的更多相关文章
- UVa1608 UVaLive6258 Non-boring sequences
填坑系列(p.248) 比较神 从两端枚举 最坏复杂度就成O(nlogn)了 #include<cstdio> #include<cstdlib> #include<al ...
- 8-16 不无聊序列 non-boring sequences uva1608
题意: 如果一个序列的任意连续子序列中至少有一个只出现一次的元素 则称这个序列是 不无聊序列 输入一个n个元素的序列a 判断是不是不无聊序列 一开始想当然 以为只要 2位的子序列都满足即可 ...
- uva1608 Non-boring sequences
某个序列找到唯一元素后,判断被分成的两边的序列即可问题在于找到唯一元素连续序列,重复元素的问题:感觉很有一般性 查找相同元素用map,last,next存上一个相同元素的位置复杂度计算有点思考:记录l ...
- UVA-1608
We were afraid of making this problem statement too boring, so we decided to keep it short. A sequen ...
- 题解 UVA1608 【不无聊的序列 Non-boring sequences】
思路: 算法很显然: 一.在区间\([l,r]\)找到一个只出现一次的元素P(如果不存在,那么序列\(boring\)) 二.递归处理区间\([l,p-1]\)和区间\([p+1,r]\). 其关键在 ...
- ●UVA 1608 Non-boring sequences
题链: https://vjudge.net/problem/UVA-1608#author=chenchonghan题解: 分治 如果一个区间[l,r]里面在p位置出现了一个只出现一次的元素,(如果 ...
随机推荐
- bootstrap 左右框多项选择示例
bootstrap 左右选择框,左边框是未选项,右边框是已选择项,提供单选,全选按钮,以及取消已选项,如图示:
- android SDK manager 无法获取更新版本列表【转载】
http://mirrors.neusoft.edu.cn/eclipse/releases/luna/打开这个网址就可以看到adt的详细信息: http://developer.android.c ...
- ACM学习历程—UESTC 1219 Ba Gua Zhen(dfs && 独立回路 && xor高斯消元)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1219 题目大意是给了一张图,然后要求一个点通过路径回到这个点,使得xor和最大. 这是CCPC南阳站的一道题 ...
- tarjan求割点
首先给大家一个网址讲的比较细:http://www.cnblogs.com/en-heng/p/4002658.html 如果还有不懂的话,可以回来再看看我的文章; 概念明确: 树边:(在[2]中称为 ...
- UILabel的富文本显示选项
UILabel的富文本格式设置 1.实例化方法和使用方法 实例化方法: 使用字符串初始化 - (id)initWithString:(NSString *)str; 例: NSMutableAttri ...
- DEBUG命令详细说明
启动DEBUG 1.打开Windows命令窗口 在Windows 95/98的环境中,打开命令窗口的步骤为:点击“开始”→“运行”,输入“command”命令: 在WindowsXP及WIN7的环境中 ...
- 服务注册选型比较:Consul vs Zookeeper vs Etcd vs Eureka
zookeeper基于paxos的化简版zab,etcd基于raft算法.consul也是基于raft算法.etcd和consul作为后起之秀,并没有因为已经有了zookeeper而放弃自己,而是采用 ...
- Parallel Programming-多消费者,多生产者同时运行并行
在上一篇文章演示了并行的流水线操作(生产者和消费者并行同时执行),C#是通过BlockingCollection这个线程安全的对象作为Buffer,并且结合Task来实现的.但是上一篇文章有个缺陷,在 ...
- Excel用vlookup方法匹配数据
(1) VLOOKUP是一个查找函数,给定一个查找的目标,它就能从指定的查找区域中查找返回想要查找到的值.它的基本语法为: VLOOKUP(查找目标,查找范围,返回值的列数,精确OR模糊查找) ...
- man syslog | col -b > syslog.txt
linux man手册导出,解决man乱码 man syslog | col -b > syslog.txt