题解 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
题目传送门 题目大意:维护一个序列,维护区间加等差数列,单点查询的操作. 首先我们肯定是要用线段树来维护了,按照一般的思维局限,我选择了维护序列中的值,但是区间修改的时候由于公差的存在,所以区间修改有 ...
随机推荐
- 入门大数据---SparkSQL联结操作
一. 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据.分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark = SparkSessio ...
- .net core docker容器编排部署(linux)
环境准备 需要一个linux操作系统:我这里用的是ubuntu 18.04,安装步骤就不说了,网上很多教程,当然也可以私信我. 既然需要用到docker,那么就安装个docker,apt instal ...
- oracle闪回,找回已提交修改的记录
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_24521431/article/details/84580166 例如删除ward_id为96 ...
- 部署rabbitMQ镜像集群实战测试
部署rabbitMQ镜像集群 版本信息 rabbit MQ: 3.8.5 Erlang: 官方建议最低21.3 推荐22.x 这里用的是23 环境准备 主机规划 主机 节点 172.16.14.3 磁 ...
- valueOf()、toString()
基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题. JavaScript 的 valueOf() 方法 valu ...
- Java中的过滤器
什么是过滤器(Filter)? 过滤器就是一个实现了特殊接口的Java类.实现对请求资源的过滤的功能. 过滤器是Servlet技术中最为实用的技术. 过滤器有啥用? 对目标资源进行过滤. 自动登录,解 ...
- centos7在Evolution中配置163邮箱,被阻止收件解决方法
config.mail.163.com/settings/imap/login.jsp?uid=xxxx@163.com
- 使用vs2019加.net core 对WeiApi的创建
vs2019创建webapi 1.创建新的项目 2.选择.NET CORE的ASP .NET CORE WEB应用程序 3.定义项目名称和存放地点 4.选择API创建项目 5.删除原本的无用的类 6. ...
- C++中cin>>a原理
int a; vector<int>res; while(cin>>a){ res.push_back(a); } 给出这段代码 可以输入1 2 3 4 5并以回车结束,从而 ...
- nodejs gulp如何获取参数
比如执行gulp test 如果需要获取test,使用命令process.argv即可 如果执行gulp test --module aaaa,这句话表示的意思执行gulp test,顺带参数modu ...