【NOIP模拟】序列
【问题描述】
一个序列被称为有趣的序列是它的所有的子串拥有一个唯一的整数(这个整数在整个序
列中只出现过一次)。
给你一个序列的整数, 问你它是否是有趣的。
【输入格式】
第一行 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)。
#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模拟】序列的更多相关文章
- NOIP 模拟 序列操作 - 无旋treap
题意: 一开始有n个非负整数h[i],接下来会进行m次操作,第i次会给出一个数c[i],要求选出c[i]个大于0的数并将它们-1,问最多可以进行多少次? 分析: 首先一个显然的贪心就是每次都将最大的c ...
- 2018.10.08 NOIP模拟 序列(主席树)
传送门 T2防ak题? 其实也不是很难(考试时sb了). 直接变形一下求出区间长度在[l2,r2][l2,r2][l2,r2]之间,中位数≤l1−1\le l1-1≤l1−1的区间数,和区间长度在[l ...
- 2018.10.02 NOIP模拟 序列维护(线段树+广义欧拉定理)
传送门 一道比较好的线段树. 考试时线性筛打错了于是弃疗. 60分暴力中有20分的快速幂乘爆了于是最后40分滚粗. 正解并不难想. 每次区间加打懒标记就行了. 区间查询要用到广义欧拉定理. 我们会发现 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- 11.7 NOIP模拟赛
目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...
- NOIP模拟赛-2018.11.7
NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
随机推荐
- Building REST services with Spring
https://spring.io/guides/tutorials/bookmarks/
- js 中常用的正则表达式
主要有以下几种: 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了哦 获取日期正则表达式:\d{4}[年|\-|\.]\d{1,2}[ ...
- mongodb学习之:主从复制
在sql server能够做到读写分离,双机热备份和集群部署,这些在mongodb也能做到.首先来看主从复制.我们就在一台电脑上进行操作 第一步:分别建立master和slave两个文件夹 第二步:开 ...
- 用ASTERISK搭建自己的免费VOIP服务器
服务器别闲着,博主又要给大家带来新的玩法咯 1. 这里以 Debian 为例子,安装 Asterisk apt-get update apt-get install asterisk 2. 预设置 A ...
- UVA10870 Recurrences —— 矩阵快速幂
题目链接:https://vjudge.net/problem/UVA-10870 题意: 典型的矩阵快速幂的运用.比一般的斐波那契数推导式多了几项而已. 代码如下: #include <bit ...
- weixin报警脚本
#!/bin/bash ### script name weixin.sh ### send messages from weixin for zabbix monitor ### jack ### ...
- CentOS系统文件和目录管理相关的一些重要命令
我们都知道,在Linux系统中,基本上任何我们需要做的事都可以通过输入命令来完成,所以在Linux系统中命令非常的多,我们不可能也没必要记住所有的这些命令,但是对于一些常用的命令我们还是必须要对其了如 ...
- laravel基础课程---1、laravel安装及基础介绍(laravel如何安装)
laravel基础课程---1.laravel安装及基础介绍(laravel如何安装) 一.总结 一句话总结: [修改composer镜像地址].[明确laravel的安装要求].[安装指定版本的la ...
- 详细的解说public,protected,Default和private的权限问题
详细的解说public,protected,Default和private的权限问题 让人更好的了解public,protected,Default和private他们之间的权限问题,我会做一个直观的 ...
- 谈谈java中成员变量与成员方法继承的问题
谈谈java中成员变量与成员方法继承的问题 关于成员变量和成员方法的的继承问题,我也可以做一个小测试,来看看结果. 首先我们先创建一个父类: