【问题描述】

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

【输入格式】

第一行 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. dataware fact 事实 不可更新 data warehousing business intelligence 优劣判据

    不可 Kimball维度建模 维度建模,而非数据建模 文本型度量是对某些事情的描述.虽然以文本方式度量事实是可行的,但是应将其放入维度表中,除非对事实表的每个行,其文本是唯一的. 数据仓库的好坏直接取 ...

  2. FireMonkey 结构性初略分析

    Delphi 下的FireMonkey,很好地实现了 DirectUI与跨平台.学习了解他,对DirectUI编程及项目的跨平台实现有一定帮助.虽然作为开发者个体,并不需要了解太多这些东西,只要求拿来 ...

  3. 1 Maven简介

    一.构建(build)     清理.编译.测试.打包.部署等一系列操作. 二.maven介绍:     maven是一个强大的构建工具,能够帮助我们自动化构建过程:从清理(clean).编译(com ...

  4. 【C++基础学习】引用和指针、重载、函数、内存管理

    第一部分:引用VS指针 引用的含义:变量的别名 注意:变量不能只有别名,必须有一个真实的变量与之相对应 基本数据类型的引用 对别名本身的操作和它的实体的操作是一样的 1.基本数据类型的引用 类型 &a ...

  5. 牛客练习赛14 D 比较月亮大小 【水】

    链接:https://www.nowcoder.com/acm/contest/82/D 来源:牛客网 比较月亮大小 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...

  6. POJ 2506 Tiling (递推 + 大数加法模拟 )

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7965   Accepted: 3866 Descriptio ...

  7. ansible安全优化建议

    摘自 ansible自动化配置书籍,特此感谢 针对非授权连接和截取通信息等共计行为,我们总结了9条方法: 使用安全加密的通信方式 禁止root用户远程登录并充分利用sudo 移除非必须的软件,只开放需 ...

  8. ES6 新特性之Symbol

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

  9. Django_model基础

    Django-model基础   ORM 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 创建表( ...

  10. 小trick之mklink

    因为要看很多论文就下载安装了zotero,又因为文献库的文件夹在安装目录太深,找起来太麻烦,再加上是软件本身的安装目录,因此把论文都下载在默认文件中总会天然地产生不安全感,万一误删软件怎么办.所以在文 ...