传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4059

【题解】

考虑分治。定义过程solve(l,r)为判断全在[l,r]范围内的所有连续子序列是不是non-boring的

那么我们预处理每个地方的前一个与它相同的数pre[i]和后一个与它相同的数nxt[i]。

显然对于i属于[l,r],如果存在pre[i]<l,nxt[i]>r,那么任何经过i的连续子序列都合法,所以就分成[l,i-1]和[i+1,r]检测即可。

为了保证复杂度,我们要从两边同时往中间搜,这样复杂度为

T(n) = max{T(n-k) + T(k) + O(min(k, n-k))} = O(nlogn)

或者用“启发式合并”的逆过程也能证明。

# include <stdio.h>
# include <algorithm>
# include <vector>
// # include <bits/stdc++.h> using namespace std; int T, n, a[], pre[], nxt[];
int lst[], na[];
vector<int> vec;
vector<int>::iterator it; inline bool judge(int l, int r) {
if (l == r) return ;
if (l == r-) return a[l] != a[r];
for (int i=l, j=r; i<=j; ++i, --j) {
if(pre[i] < l && nxt[i] > r) {
if(i != l) return judge(l, i-) && judge(i+, r);
else return judge(i+, r);
}
if(pre[j] < l && nxt[j] > r) {
if(j != r) return judge(l, j-) && judge(j+, r);
else return judge(l, j-);
}
}
return ;
} inline void out(int *ot, int ed) {
for (int i=; i<=ed; ++i) printf("%d ", ot[i]);
puts("");
} int main() {
scanf("%d", &T);
while(T--) {
vec.clear();
scanf("%d", &n);
for (int i=; i<=n; ++i) {
scanf("%d", &a[i]);
pre[i] = , nxt[i] = n+;
vec.push_back(a[i]);
}
sort(vec.begin(), vec.end());
it = unique(vec.begin(), vec.end());
vec.erase(it, vec.end());
for (int i=; i<=n; ++i)
na[i] = lower_bound(vec.begin(), vec.end(), a[i]) - vec.begin() + ; for (int i=; i<=n; ++i) lst[i] = ;
for (int i=; i<=n; ++i) {
if(lst[na[i]] != ) pre[i]=lst[na[i]];
lst[na[i]]=i;
} for (int i=; i<=n; ++i) lst[i] = n+;
for (int i=n; i>=; --i) {
if(lst[na[i]] != n+) nxt[i]=lst[na[i]];
lst[na[i]]=i;
} //out(pre, n);
//out(nxt, n); if(judge(, n)) puts("non-boring");
else puts("boring");
} return ;
}

bzoj4059 [Cerc2012]Non-boring sequences的更多相关文章

  1. 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 ...

  2. 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences

    这个做法名字是从武爷爷那里看到的…… Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子 ...

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

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

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

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

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

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

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

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

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

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

  8. 【BZOJ4059】Non-boring sequences(分析时间复杂度)

    题目: BZOJ4059 分析: 想了半天没什么想法,百度到一个神仙做法-- 设原数列为 \(a\),对于每一个 \(i\) 求出前一个和后一个和 \(a_i\) 相等的位置 \(pre[i]\) 和 ...

  9. [Cerc2012]Non-boring sequences

    Description 定义一个序列是不无聊的,当且仅当它的所有子区间都存在一个独一无二的数字,即每个子区间里至少存在一个数字只出现过一次.给定一个长度为\(N(N\leq2\times 10^5)\ ...

随机推荐

  1. MySQL字段属性介绍

    引言 这次Qi号分享MySQL字段属性简介.下面资料是Qi号搜集大量资料与个人理解的整理. MySQL提供了一组可以赋给表中各个列的数据类型,每个类型都强制数据满足为该数据类型预先确定的一组规则,例如 ...

  2. tcl之控制流-switch

  3. react native "Unable to resolve module `AccessibilityInfo`

    error: bundling failed: "Unable to resolve module `AccessibilityInfo` from `/Users/apple/Websto ...

  4. yii2 的登录注册 轮子

    //利用到了yii2 框架之中的验证规则 进行判定而已 也不是很高深的东西  但是 使用框架自身的轮子 会有安全性能的隐患 1注册reg controller 中 我都以admin 为例子 publi ...

  5. [Hdu4825]Xor Sum(01字典树)

    Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问 ...

  6. 栈--数据结构与算法Javascript描述(4)

    栈 Stack 概念 栈是一种高效的数据结构,数据只能在栈顶添加或者删除,所以这样的操作很快,而且容易实现.栈的使用遍布程序语言的方方面面,从表达式求值到处理函数调用. 栈是一种特殊的列表,栈内的元素 ...

  7. SpringMVC---springMVC配置文件(springweb.xml)简介

    再web.xml中设置HTTP请求的中央调度处理器DispatcherServlet时,会指定SpringMVC配置文件,这里取名springweb.xml是因设置DispatcherServlet时 ...

  8. sql查询作业答案

    sql查询作业答案   阅读目录 一 题目 二 答案 一 题目 1.查询所有的课程的名称以及对应的任课老师姓名 2.查询学生表中男女生各有多少人 3.查询物理成绩等于100的学生的姓名 4.查询平均成 ...

  9. shell判断文件是否存在[转]

    原文出处: http://canofy.iteye.com/blog/252289 shell判断文件,目录是否存在或者具有权限 #!/bin/sh myPath="/var/log/htt ...

  10. Android学习记录(3)—Android中ContentProvider的基本原理学习总结

    一.ContentProvider简介        当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...