题解 UVA1608 【不无聊的序列 Non-boring sequences】
思路:
算法很显然:
一、在区间\([l,r]\)找到一个只出现一次的元素P(如果不存在,那么序列\(boring\))
二、递归处理区间\([l,p-1]\)和区间\([p+1,r]\)。
其关键在于如何找到一个只出现一次的元素P。
首先,我们得知道如何判断一个元素是不是只出现一次。
我们可以用\(STL\)中的\(map\)记录与当前元素值相同的上一个元素 or 下一个元素的位置,然后更新即可。
因为\(map\)的所有操作都是\(O(log_n)\)的,所以预处理的时间复杂度为\(O(nlog_n)\)。
所以,我们就可以用\(O(1)\)的时间判断出一个元素是不是只出现一次了。
若从左到右扫描整个序列,那么最坏情况,这个元素在序列的最右边,则\(Time(n)=Time(n-1)+O(n) \ge Time(n^2)=O(n^2)\)。
根据二分法(分治)一般是尽量分成两个数量尽量接近的数列,我们可以考虑从两边往中间找。
此时,最坏情况为这个元素在序列的正中间,则\(Time(n)=2\times Time(n/2)+O(n)\),解得\(Time(n)=O(nlog_n)\)。
所以算法的总时间复杂度为\(O(nlog_n)\)。
#include <bits/stdc++.h>
using namespace std;
int s[200010];
int last[200010];
int nxt[200010];
map<int,int>be;
map<int,int>wi;
inline bool solve(int l,int r){
if(l>=r)
return 1;
int x=l,y=r;
while(x<=y){
if(last[x]<l&&nxt[x]>r)
return solve(l,x-1)&&solve(x+1,r);
else if(last[y]<l&&nxt[y]>r)
return solve(l,y-1)&&solve(y+1,r);
x++,y--;
}
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--) {
int n;
scanf("%d",&n);
be.clear();
wi.clear();
for(int i=1;i<=n;i++) {
scanf("%d",&s[i]);
if(!be.count(s[i]))last[i]=-1;
else last[i]=be[s[i]];
be[s[i]]=i;
}
for(int i=n;i>0;i--) {
if(!wi.count(s[i]))nxt[i]=n+1;
else nxt[i]=wi[s[i]];
wi[s[i]]=i;
}
if(solve(1,n))
printf("non-boring");
else
printf("boring");
}
return 0;
}
题解 UVA1608 【不无聊的序列 Non-boring sequences】的更多相关文章
- U4687 不无聊的序列
U4687 不无聊的序列 0通过 85提交 题目提供者飞翔 标签 难度尚无评定 提交 最新讨论 暂时没有讨论 题目背景 如果一个序列的任意一个连续的子序列中没有只出现一次的元素,辣么kkk就认为这个序 ...
- uva 1608 不无聊的序列
uva 1608 不无聊的序列 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=2 ...
- 【题解】P4247 [清华集训]序列操作(线段树修改DP)
[题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...
- 【转】Python数据类型之“序列概述与基本序列类型(Basic Sequences)”
[转]Python数据类型之“序列概述与基本序列类型(Basic Sequences)” 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主 ...
- UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 先预处理出每个元素之前和之后相同元素出现的位置,就可以在O(1)的 ...
- 题解 P4093 【[HEOI2016/TJOI2016]序列】
这道题原来很水的? noteskey 一开始以为是顺序的 m 个修改,然后选出一段最长子序列使得每次修改后都满足不降 这 TM 根本不可做啊! 于是就去看题解了,然后看到转移要满足的条件的我发出了黑人 ...
- [题解](堆)luogu_P1631序列合并
思路来自题解 作者: Red_w1nE 更新时间: 2016-11-13 20:46 在Ta的博客查看 72 最近有点忙 没时间贴代码了== [分析] 首先,把A和B两个序列分别从小到大排序,变成两 ...
- 【题解】Luogu P2572 [SCOI2010]序列操作
原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...
- Luogu P1438无聊的序列【线段树/差分】By cellur925
题目传送门 题目大意:维护一个序列,维护区间加等差数列,单点查询的操作. 首先我们肯定是要用线段树来维护了,按照一般的思维局限,我选择了维护序列中的值,但是区间修改的时候由于公差的存在,所以区间修改有 ...
随机推荐
- 入门大数据---Spark_Streaming与流处理
一.流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中.应用程序根据需要查询数据或计算数据.这就是传统的静态数据处理架构.Hadoop 采用 HDFS 进 ...
- centos 7 增加永久静态路由
1 在 /etc/sysconfig/network-scripts/ 目录下添加route-eth3,eth3为实际网卡名称. [root@compute1 ~]# cat /etc/sysconf ...
- python 类中方法总结 --- 实例方法、类方法、静态方法
在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...
- 深度学习论文翻译解析(八):Rich feature hierarchies for accurate object detection and semantic segmentation
论文标题:Rich feature hierarchies for accurate object detection and semantic segmentation 标题翻译:丰富的特征层次结构 ...
- " 橘松 " 的自我介绍
昵称:(OrangeCsong)橘松(在其他平台也是这个名字) 年龄:95后(摩羯座) 性别:boy 性格:性格还阔以,不轻易发脾气,沉稳.喜欢独立思考. 爱好:运动(工作了,运动时间太少),基金理财 ...
- [译]高性能缓存库Caffeine介绍及实践
概览 本文我们将介绍Caffeine-一个Java高性能缓存库.缓存和Map之间的一个根本区别是缓存会将储存的元素逐出.逐出策略决定了在什么时间应该删除哪些对象,逐出策略直接影响缓存的命中率,这是缓存 ...
- 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)
题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...
- JAVA基础笔记15-16-17-18
十五.今日内容介绍 1.Object 2.String 3.StringBuilder =第一节课开始======================= 01API概念 * A:API(Applicati ...
- 隐写工具outguess安装使用介绍
0x00 outguess下载安装 Kail终端命令输入git clone https://github.com/crorvick/outguess 安装包随即下载到文件夹.双击打开文件夹,右键点 ...
- asp.net mvc企业实战技能汇总