【问题描述】

一个序列被称为有趣的序列是它的所有的子串拥有一个唯一的整数(这个整数在整个序
列中只出现过一次)。
给你一个序列的整数, 问你它是否是有趣的。

【输入格式】

第一行 T, 表示数据组数。
接下来每组数据第一行一个 n。
接下来是 n 个整数, 均小于 10^9。

【输出格式】

输出 boring 或者 non-boring。

【输入样例】

4

5

1 2 3 4 5

5

1 1 1 1 1

5

1 2 3 2 1

5

1 1 2 1 1

【输出样例】

non-boring

boring

non-boring

boring

【数据范围与约定】

对于 30%的数据: n<=10。

对于 100%的数据: n <= 200000, 每个整数小于 10^9。

ps: 子串为一个连续的区间。


下面的题解是PPT里的官方题解

100分:
优秀的暴力。
对于一个a[i],前一次出现记为pre[i],后一次出现记为nex[i]。
那左端点l在pre[i]+1..i,右端点在i..nex[i]-1都是合法的。
如果判定一个区间[l,r],a[i]是其中唯一出现过的数字。
那这个区间就可以切割成判定2个区间[l,i - 1],[i + 1, r]。
那对于一个区间[l,r],i,j同时从左边和右边开始扫,碰到第一个唯一出现的数字就切割。直到l>=r。
这种做法看起来很像暴力,但实际上跑得飞快。
 
时间复杂度证明:
T(n) = T(k) + T(n-k)+min(n, n - k)。
一种直观的想法就是,每次复杂度都是较小的那个区间。
倒过来看相当于较小的合并到较大的。那就是启发式合并。
O(nlogn)。
 
 然后下面是自己的话:
 
昨天 小奇的糖果 里我好像说过遇到这种有不同颜色的东西经常把相同颜色的用双向链表串起来,结果早上模拟考时还是没有这样操作(只写了30分暴力)
早上的暴力程序还因为 boring 打成了 borning 结果30分都没拿到(!) 失望~~ (下次一定要注意)
直接贴代码好了
 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> #define For(i,a,b) for(register int i=a;i<=b;++i)
#define Dwn(i,a,b) for(register int i=a;i>=b;--i)
#define Re register using namespace std; const int N=2e5+;
int Ld[N],Rd[N],a[N],lst[N];
struct LIS{
int x,id;
}Lis[N];
int n,m,x,y;
inline void read(int &v){
v=; bool fg=;
char c=getchar(); if(c=='-')fg=;
while(c<''||c>''){c=getchar(); if(c=='-')fg=;}
while(c>=''&&c<=''){v=v*+c-'',c=getchar(); if(c=='-')fg=;}
if(fg)v=-v;
}
bool cmp(const LIS &a,const LIS&b){
return a.x<b.x;
} bool Trial(int l,int r){
if(l>=r)return ;
int pl=l,pr=r;
int ppl=l,ppr=r; bool fail=,nxfail=;
while(pl<=pr){
fail=;
if(Ld[pl]<ppl&&Rd[pl]>ppr){
fail=;
if(Trial(ppl,pl-))return ;
ppl=pl+; nxfail=;
pr=ppr;
} pl++;
if(pl>pr)break;
fail=;
if(Ld[pr]<ppl&&Rd[pr]>ppr){
fail=;
if(Trial(pr+,ppr))return ;
ppr=pr-; nxfail=;
pl=ppl;
}
pr--;
if(pl>pr)break; }
if(fail)return ;
else return ;
} int main(){
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
int T;
read(T);
while(T--){
memset(lst,,sizeof(lst));
memset(Ld,,sizeof(Ld));
memset(Rd,,sizeof(Rd));
read(n);
For(i,,n)read(Lis[i].x),Lis[i].id=i;
sort(Lis+,Lis+n+,cmp);
Lis[].x=-;
int tt=;
For(i,,n){
if(Lis[i].x!=Lis[i-].x)tt++;
int ID=Lis[i].id;
a[ID]=tt;
}
For(i,,n){
int ax=a[i];
int prD=lst[ax];
Ld[i]=prD; Rd[i]=n+;
if(prD)Rd[prD]=i;
lst[ax]=i;
}
if(Trial(,n)){
printf("boring\n");
}else{
printf("non-boring\n");
}
}
fclose(stdin); fclose(stdout);
return ;
}
 

【NOIP模拟】序列的更多相关文章

  1. NOIP 模拟 序列操作 - 无旋treap

    题意: 一开始有n个非负整数h[i],接下来会进行m次操作,第i次会给出一个数c[i],要求选出c[i]个大于0的数并将它们-1,问最多可以进行多少次? 分析: 首先一个显然的贪心就是每次都将最大的c ...

  2. 2018.10.08 NOIP模拟 序列(主席树)

    传送门 T2防ak题? 其实也不是很难(考试时sb了). 直接变形一下求出区间长度在[l2,r2][l2,r2][l2,r2]之间,中位数≤l1−1\le l1-1≤l1−1的区间数,和区间长度在[l ...

  3. 2018.10.02 NOIP模拟 序列维护(线段树+广义欧拉定理)

    传送门 一道比较好的线段树. 考试时线性筛打错了于是弃疗. 60分暴力中有20分的快速幂乘爆了于是最后40分滚粗. 正解并不难想. 每次区间加打懒标记就行了. 区间查询要用到广义欧拉定理. 我们会发现 ...

  4. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  5. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  6. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  7. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  8. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  9. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  10. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

随机推荐

  1. [自动化平台系列] - 初次使用 Macaca-前端自动化测试(1)

    1. 所先看一下官方地址,了解一下这个是不是你想要的测试工具 https://macacajs.github.io/macaca/environment-setup.html 2. 去掉sudo -- ...

  2. Python多线程模块

    引言 thread threading 1 Thread 11 下面使用threading模块实现与上面相同的功能 12 在创建新线程时还可以给Thread传递可调用类的对象这样使用类本身来保存信息 ...

  3. platform_set_drvdata和platform_get_drvdata用法【转】

    本文转载自:http://www.cnblogs.com/wangxianzhen/archive/2013/04/09/3009530.html 在用到Linux设备驱动的platform框架时,常 ...

  4. SDK Manager中勾选项

    运行SDK Manager 勾选对应版本的SDK,从这里基本可以知道一个Android版本对应着一个版本的API. 其中每个包都有这么几个文件: Documentation for Android S ...

  5. YII好的博客

    http://blog.csdn.net/wzllai/article/details/7659008

  6. Java多线程Callable和Future类详解

         public interface Callable<V>    返回结果并且可能抛出异常的任务.实现者定义了一个不带任何参数的叫做 call 的方法      public in ...

  7. 谈谈嵌套for循环的理解

    谈谈嵌套for循环的理解     说for的嵌套,先说一下一个for循环的是怎么用的.      这次的目的是为了用for循环输出一个乘法口诀表,一下就是我的一步步理解.    一.   语法:   ...

  8. DIY一个DNS查询器:程序实现

    上一篇文章<DIY一个DNS查询器:了解DNS协议>中讲了DNS查询协议的原理和数据结构.经过两个星期的开发,完成了该查询器的编写.期间也遇到了一些问题,如: 1资源记录(Resource ...

  9. Win32环境下代码注入与API钩子的实现

    本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在VS下编写和调试Win32应用程序和动态链接库 ...

  10. QQ登陆功能的实现2

    QQ登陆功能的实现2 由于看到园子里有朋友说需要讲解和剖析实现的步骤,前面的QQ登陆实现只有代码,所以这篇补上 1.  分析 1). 当运行QQ.exe后会出现qq登陆界面的窗体 2). 我们用spy ...