【问题描述】

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

【输入格式】

第一行 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. 2018.11.20-day22 类中代码的执行顺序&组合

    1.类中代码的执行顺序 2.组合

  2. Android Button Maker(在线生成android shape xml文件的工具),真方便!

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/scry5566/article/details/25379275        直接上地址:http ...

  3. Linux环境编程之同步(三):读写锁

    概述 相互排斥锁把试图进入我们称之为临界区的全部其它线程都堵塞住.该临界区通常涉及对由这些线程共享一个或多个数据的訪问或更新.读写锁在获取读写锁用于读某个数据和获取读写锁用于写直接作差别. 读写锁的分 ...

  4. 【Effective C++】设计与声明

    条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. ...

  5. 剑指Offer:树的子结构【26】

    剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...

  6. 3个CCIE考官对一个高级工程师的面试题

    3个CCIE考官对一个高级工程师的面试题 转载 时间:2015-7-10 原文转载: 1.现在的6509及7609,SUP720交换带宽去到720G,是不是可以说7609/6509 可以取代一部分GS ...

  7. ES6 新特性之Symbol

    Symbol let s1 = Symbol('foo'); let s2 = Symbol('bar'); s1 // Symbol(foo) s2 // Symbol(bar) s1.toStri ...

  8. 第三篇:python基础之数据类型与变量

    阅读目录 一.变量 二.数据类型 2.1 什么是数据类型及数据类型分类 2.2 标准数据类型: 2.2.1 数字 2.2.1.1 整型: 2.2.1.2 长整型long: 2.2.1.3 布尔bool ...

  9. PGTM通用性能测试模型

    PTGM通用性能测试模型 一.      测试前期准备阶段 目标: 1. 保证系统稳定性: 2. 建立合适的测试团队. 活动: 1.    系统基础功能验证 类似于BVT测试,确保被测系统已具备进行性 ...

  10. keras中的Flatten和Reshape

    最近在看SSD源码的时候,就一直不理解,在模型构建的时候如果使用Flatten或者是Merge层,那么整个数据的shape就发生了变化,那么还可以对应起来么(可能你不知道我在说什么)?后来不知怎么的, ...