这个做法名字是从武爷爷那里看到的……

Description

我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短。一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次。给定一个整数序列,请你判断它是不是不无聊的。

Input

第一行一个正整数T,表示有T组数据。每组数据第一行一个正整数n,表示序列的长度,1 <= n <= 200000。接下来一行n个不超过10^9的非负整数,表示这个序列。

Output

对于每组数据输出一行,输出"non-boring"表示这个序列不无聊,输出"boring"表示这个序列无聊。

Sample Input

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

Sample Output

non-boring
boring
non-boring
boring

题目分析

颜色类的问题,处理$pre_i$和$nxt_i$算是一种套路吧。

考虑点$i$,它对于答案的贡献为$[l,r](l \in (pre_i,i],r \in [i,nxt_i))$。那么自然,如果数据结构强上就是线段树+扫描线二维数点。

但是有一种神奇的优秀(暴力)做法(做法来源):我们注意到只要横跨$i$的区间就都是合法的。那么分治地考虑这个问题,$split(l,r)$表示$[l,r]$这个区间是否独立合法,转移时只需要找到一个$i$能够覆盖$[l,r]$就能拆分这个区间。

还要一点需要注意到的小细节(不过应该也是这类分治问题都存在的问题),寻找$i$的过程需要左右两边横跳,这样复杂度就能被控制在$T(n)=\max\{T(k)+T(n-k)+\min(k,n-k)\}=O(nlogn)$而不是$T(n)=\max\{T(k)+T(n-k)+n)\}=O(n^2)$

 #include<bits/stdc++.h>
const int maxn = ; int T,n,cnt;
int a[maxn],t[maxn],pre[maxn],nxt[maxn],lst[maxn]; inline char nc()
{
static char buf[],*p1=buf,*p2=buf;
if (p1==p2) {
p2=(p1=buf)+fread(buf,,,stdin);
if (p1==p2) return EOF;
}
return *p1++;
}
#define getchar nc
int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
bool split(int l, int r)
{
if (l >= r) return ;
int x = l, y = r;
for (int i=l; i<=r; i++)
if (i&){
if (pre[x] < l&&nxt[x] > r)
return split(l, x-)&&split(x+, r);
x++;
}else{
if (pre[y] < l&&nxt[y] > r)
return split(l, y-)&&split(y+, r);
y--;
}
return ;
}
int main()
{
T = read();
while (T--)
{
cnt = n = read();
memset(lst, , n<<);
memset(pre, , n<<);
memset(nxt, , n<<);
for (int i=; i<=n; i++) t[i] = a[i] = read();
std::sort(t+, t+n+);
cnt = std::unique(t+, t+n+)-t-;
for (int i=; i<=n; i++){
a[i] = std::lower_bound(t+, t+cnt+, a[i])-t;
nxt[lst[a[i]]] = i, pre[i] = lst[a[i]];
lst[a[i]] = i, nxt[i] = n+;
}
puts(split(, n)?"non-boring":"boring");
}
return ;
}

END

【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences的更多相关文章

  1. 【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree

    和bzoj4059: [Cerc2012]Non-boring sequences非常相似 Description 一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且 ...

  2. bzoj4059 [Cerc2012]Non-boring sequences && bzoj5200 [NWERC2017]Factor-Free Tree

    https://konnyakuxzy.github.io/BZPRO/JudgeOnline/4059.html https://cn.vjudge.net/problem/Gym-100624D ...

  3. bzoj4059 [Cerc2012]Non-boring sequences

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题解] 考虑分治.定义过程solve(l,r)为判断全在[l,r]范围内的所有连续子 ...

  4. BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)

    这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...

  5. BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的 ...

  6. BZOJ 4059: [Cerc2012]Non-boring sequences(启发式分治)

    传送门 解题思路 首先可以想到要预处理一个\(nxt_i\)和\(pre_i\),表示前后与当前位置权值相同的节点,那么这样可以迅速算出某个点在某段区间是否出现多次.然后这样的话就考虑分治,对于\([ ...

  7. 【bzoj4059】[Cerc2012]Non-boring sequences 分治

    题目描述 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列, ...

  8. 【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)

    4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 16 ...

  9. BZOJ 4059: [Cerc2012]Non-boring sequences ( )

    要快速在一段子序列中判断一个元素是否只出现一次 , 我们可以预处理出每个元素左边和右边最近的相同元素的位置 , 这样就可以 O( 1 ) 判断. 考虑一段序列 [ l , r ] , 假如我们找到了序 ...

随机推荐

  1. Ant Design中的Form组件

    1. 使用Form.create()包裹过的组件可以获取到this.props.form属性 Form.create()(Comp) 2. getFieldDecorator() // 在表单中的使用 ...

  2. mysql实现rownum方法

    1.语句:SELECT @rownum:=@rownum+1 AS rownum, Orderstate.* FROM (SELECT @rownum:=0) r, Orderstate ; 执行结果 ...

  3. C# Dictionary类型转json方法之一

    using Newtonsoft.Json;//引用命名空间 Dictionary<string, string> Content = new Dictionary<string, ...

  4. 遇到的一些vue的问题

    一.事件绑定中的事件处理方法后加不加括号问题 1.例如: click事件后加不加括号 a.@click = "getContent" b.@click = "getCon ...

  5. LWIP学习之一些细节

    一 绑定端口后,开启监听,为何监听还要返回一个新的连接?:监听状态的连接只需要很小的内存,于是tcp_listen()就会收回原始连接的内存,而重新分配一个较小内存块供处于监听状态的连接使用. 二 t ...

  6. Spark Mllib里的Mllib基本数据类型(图文详解)

    不多说,直接上干货! Spark Mllib基本数据类型,根据不同的作用和应用场景,分为四种不同的类型 1.Local  vector : 本地向量集,主要向spark提供一组可进行操作的数据集合 2 ...

  7. nodejs 实践:express 最佳实践 (一) 项目结构

    express 最佳实践 (一) 第二篇: express 最佳实践(二):中间件 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色 ...

  8. display:none和visibility:hidden v-show和v-if的区别

    隐藏元素display:none 和 visibility:hidden的区别visibility:hidden可以隐藏某个元素,但是隐藏的元素仍要占据空间,仍要影响布局display:none不会占 ...

  9. Redis hash(哈希)

    Redis hash可储存多个键值对,适合储存对象的属性. 1.hset key fieldName fileValue    //hset即hash set,set这里是设置的意思.往hash中添加 ...

  10. Jquery 如何获取表单中的全部元素的值

    1.使用var formData = $(formId).serialize()获取:获取数据的格式为url参数形式的字符串.例如:id=100&name=张三   2.服务器端使用parse ...