●UVA 1608 Non-boring sequences
题链:
https://vjudge.net/problem/UVA-1608#author=chenchonghan
题解:
分治
如果一个区间[l,r]里面在p位置出现了一个只出现一次的元素,(如果不存在该元素,该区间就是boring的)
那么必然包含p的子区间都是non-boring的。
即如果存在boring的区间,必然是[l,p-1],[p+1,r]的子区间。
所以继续递归处理上面两个区间即可。
(判断某个元素是否在区间里只出现一次,只需考虑它左边第一个与它相同的元素或它右边第一个相同的元素是否在该区间里)
(需要O(N)预处理L[i],R[i]分别表示该位置左边和右边第一个与该位置相同的位置)
复杂度最坏O(N^2),不够高效。
优化就是从区间的两端同时寻找是否存在该区间内只出现一次的元素。
代码:
#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
int N;
int L[MAXN],R[MAXN];
void read_and_prework(){
static int A[MAXN],tmp[MAXN],tnt;
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&A[i]),tmp[i]=A[i];
sort(tmp+1,tmp+N+1);
tnt=unique(tmp+1,tmp+N+1)-tmp-1;
for(int i=1;i<=N;i++)
A[i]=lower_bound(tmp+1,tmp+tnt+1,A[i])-tmp;
fill(tmp+1,tmp+tnt+1,0);
for(int i=1;i<=N;i++)
L[i]=tmp[A[i]],tmp[A[i]]=i;
fill(tmp+1,tmp+tnt+1,N+1);
for(int i=N;i>=1;i--)
R[i]=tmp[A[i]],tmp[A[i]]=i;
}
bool divide(int l,int r){
if(l==r) return 1;
bool fg=1;
int i=l,j=r,k=0;
while(i<=j){
if(L[i]<l&&R[i]>r){k=i; break;}
else i++;
if(L[j]<l&&R[j]>r){k=j; break;}
else j--;
}
if(!k) return 0;
if(l<=k-1) fg&=divide(l,k-1);
if(k+1<=r) fg&=divide(k+1,r);
return fg;
}
int main(){
int Case; scanf("%d",&Case);
while(Case--){
read_and_prework();
if(divide(1,N)) printf("non-boring");
else printf("boring");
printf("\n");
}
return 0;
}
●UVA 1608 Non-boring sequences的更多相关文章
- UVa 1608,Non-boring sequences
好诡异的一个题啊 紫书上关于从左边找还是从两边往中间找的讨论没有看懂,怎么一下就找到唯一的元素了(⊙_⊙?) 方法就是用的书上讲的方法,类似于uva 11572,不过这个题需要预处理存下两边的最近的相 ...
- uva 1608 不无聊的序列
uva 1608 不无聊的序列 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=2 ...
- UVa 1608 - Non-boring sequences
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 1608 (分治 中途相遇) Non-boring sequences
预处理一下每个元素左边和右边最近的相邻元素. 对于一个区间[l, r]和区间内某一个元素,这个元素在这个区间唯一当且仅当左右两边最近的相邻元素不在这个区间内.这样就可以O(1)完成查询. 首先查找整个 ...
- UVa 1608 Non-boring sequences (分治)
题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 析:首先如果整个序列中有一个只出过一次的元素,假设是第 p 个,那 ...
- UVA - 1608 Non-boring sequences (分治,中途相遇法)
如果一个序列中是否存在一段连续子序列中的每个元素在该子序列中都出现了至少两次,那么这个序列是无聊的,反正则不无聊.给你一个长度为n(n<=200000)的序列,判断这个序列是否无聊. 稀里糊涂A ...
- UVA - 1608 Non-boring sequences(分治法)
题目: 如果一个序列的任意连续的子序列中至少有一个只出现一次的元素,则称这个序列是不无聊的.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是不是不无聊的. 思 ...
- UVA - 1608 Non-boring sequences (分治)
题意:如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列式为non-boring.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是否无聊. ...
- UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 先预处理出每个元素之前和之后相同元素出现的位置,就可以在O(1)的 ...
随机推荐
- 201621123062《java程序设计》第七周作业总结
1. 本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 1.布局管理器的具体使用方法 2.事件处理模型及其代码的编写 3.Swing中的常用组件 4. ...
- scrapy 修改URL爬取起始位置
import scrapy from Autopjt.items import myItem from scrapy.http import Request class AutospdSpider(s ...
- JAVA中if多分支和switch的优劣性。
Switch多分支语句switch语句是多分支选择语句.常用来根据表达式的值选择要执行的语句.例如,在某程序中,要求将输入的或是获取的用0-6代表的星期,转换为用中文表示的星期.该需求通过伪代码描述的 ...
- System V IPC 之信号量
本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...
- 【译】Gradle 的依赖关系处理不当,可能导致你编译异常
文章 | Ashesh Bharadwaj 翻译 | 承香墨影 授权 承香墨影 翻译.编辑并发布 在 Android Studio 中,Gradle 构建过程对于开发者来说,很大程度上是抽象的.作为一 ...
- LeetCode & Q13-Roman to Integer-Easy
Math String Description: Given a roman numeral, convert it to an integer. Input is guaranteed to be ...
- 记录Yii2代码调试中出现的两个问题(截图展示)
1.代码会中断执行,不提示错误信息,是由于substr函数第一个参数为数组造成的 2. 谷歌浏览器调试异步调用接口时出现的错误,需在接口返回处进行断点调试 这两个错误比较隐蔽,调试代码时必须认真仔细
- hadoop2.6.0理论:hdfs、yarn、mapreduce的架构
HDFS2的架构:负责数据的分布式存储 主从结构 主节点,可以有2个: namenode 从节点,有很多个: datanode namenode负责: 接收用户操作请求,是用户操作的入口 维护文件系统 ...
- python入门(6)输入和输出
python入门(6)输入和输出 输出 >>> print 'hello, world' >>> print 'The quick brown fox', 'jum ...
- 赛码网算法: 上台阶 ( python3实现 、c实现)
上台阶 题目描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法. 输入输入数据首先包含一个整数n(1<=n<=1 ...