【bzoj 4059】Non-boring sequences
这题的重点不在于代码,而在于复杂度分析……
首先我们肯定会写 $n^2$ 暴力,就是每次暴力扫 $[l,r]$ 区间,找到任意一个在此区间中只出现过一次的数。设其下标为 $mid$,显然在这个区间中任取一个子区间,只要这个子区间包含第 $mid$ 个数,这个子区间就是非“无聊的”,所以分治判断 $[l,mid-1]$ 和 $[mid+1,r]$ 两个区间是否不是“无聊的”即可。
接下来考虑优化。相信大家都听说过启发式合并,就是对于两个集合,如果合并这两个区集合的复杂度只与元素数较小的集合的元素数量有关,而与元素数较大的集合无关,设这两个集合的元素数量和为 $n$,那么我们就最多以 $O(n/2)$ 的时间合并这两个集合。
换成启发式合并的术语,就是:对于原序列的每一个位置,当包含这个数的区间往上合并时,只有区间大小至少 $\times 2$ 的情况下这个位置才会造成 $O(1)$ 的时间复杂度,否则这个位置不造成时间复杂度。所以每个位置最多造成 $O(\log{n})$ 的时间复杂度,共有 $n$ 个位置,总时间复杂度为 $O(n\times \log{n})$。
至于每个数是否在某个区间中只出现过一次……预处理一下每个位置的前驱后继即可(即上一个和下一个数值相同的位置),类似于建链表。
#include<bits/stdc++.h>
#define N 200010
using namespace std;
inline int read(){
int x=; bool f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=;
for(; isdigit(c);c=getchar()) x=(x<<)+(x<<)+(c^'');
if(f) return x;
return -x;
}
int T,n,a[N],pre[N],nxt[N];
map<int,int> mp;
bool check(int l,int r){
if(l>=r) return ;
int i=l, j=r;
while(i<=j){
if(pre[i]<l && nxt[i]>r) return check(l,i-) && check(i+,r);
if(i!=j && pre[j]<l && nxt[j]>r) return check(l,j-) && check(j+,r);
++i, --j;
}
return ;
}
int main(){
T=read();
while(T--){
n=read();
memset(nxt,0x7f,sizeof nxt);
mp.clear();
map<int,int>::iterator it;
for(int i=;i<n;++i){
a[i]=read();
it=mp.find(a[i]);
if(it!=mp.end())
pre[i]=it->second,
nxt[it->second]=i;
else pre[i]=-;
mp[a[i]]=i;
}
if(check(,n-)) printf("non-");
printf("boring\n");
}
return ;
}
upd:建议用 $sort$ 排序建链表,我写个 $map$ 跑了倒数第一……
【bzoj 4059】Non-boring sequences的更多相关文章
- 【BZOJ 4059】 (分治暴力|扫描线+线段树)
4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 632 Solved: 22 ...
- 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)
1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...
- Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路
首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego
[bzoj 4281] [ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点. ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
- 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3940 Solved: 1736 Description ...
- 【BZOJ 2132】圈地计划 && 【7.22Test】计划
两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
随机推荐
- springboot整合mybatis时java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
时区问题造成的,解决方法是在数据源配置文件中在数据库链接处增加参数&serverTimezone=GMT%2B8对时区进行配置,配置为东八区. 修改前:spring.datasource.ur ...
- 如何在WIN7下安装虚拟机linux系统
需要支持多个平台的IT管理员经常会遇到如何在Windows 7计算机上安装Linux的问题.幸运的是有多种方法可供选择:双系统.Linux虚拟机和U盘引导. 当需要用到Windows 7和Linux时 ...
- php进阶之路 -- 03 命名空间
php进阶之路 -- 03 命名空间 命名空间概述 定义命名空间 空间成员和子空间 空间成员的访问 空间引入 全局空间 一. 命名空间概述 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法. ...
- RedisTemplate5种数据结构操作
1 操作字符串 redisTemplate.opsForValue(); 2 操作hash redisTemplate.opsForHash(); 3 操作list redisTemplate.ops ...
- monkey详解
Monkey是Android系统自带的一个命令行工具,用户主要是通过adb命令来启动Monkey,Monkey在运行时,会根据命令行参数的配置,生成伪随机事件流,并在Android设备上执行对应的测试 ...
- caoz的梦呓:信息安全,别为了芝麻丢了西瓜
猫宁!!! 参考链接:https://mp.weixin.qq.com/s/z6UI-tdhN1CGdqQQuglLVQ 对方公众号:caoz的梦呓 我之前写微博的时候,经常就有读者反馈说,你怎么用3 ...
- 【神经网络与深度学习】ZLIB介绍
zlib类库提供了很多种压缩和解压缩的方式,由于时间的关系我只学习一下内容,以下是我在实现web 服务器压缩数据网页中使用到一些函数和常用数据结构.常量等. zlib使用过程 压缩过程:deflate ...
- 【转贴】SQL Server中关于跟踪(Trace)那点事
SQL Server中关于跟踪(Trace)那点事 https://www.cnblogs.com/zhijianliutang/p/4113911.html 作者很牛B.. 前言 一提到跟踪俩字,很 ...
- 【转贴】Windows常用命令实例
Windows常用命令实例 https://www.cnblogs.com/linyfeng/p/6261629.html 熟练使用DOS常用命令有助于提高工作效率. 1.windows+R:打开运行 ...
- Redis 以及 Python操作Redis
Redis Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis有以下特点: -- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可 ...