【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4059

【题目大意】

  一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,
  即每个子序列里至少存在一个数字只出现一次。
  给定一个整数序列,请你判断它是不是不无聊的。

【题解】

  预处理每个元素上一次出现位置和下一个出现位置,
  我们发现对于一个子序列[L,R]来说,
  如果存在pre[i]<L&&nxt[i]>R那么这个子序列一定是满足条件的,
  否则就不满足,那么我们分治处理这个问题,
  从两边往中间寻找这个i,那么每次拆开的复杂度就是拆成的两个序列中较小的一个,
  所以这是一个逆启发式合并的过程,复杂度O(nlogn)

【代码】

#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
const int N=200010;
int n,T,a[N],pre[N],nxt[N];
bool check(int L,int R){
if(L>=R)return 1;
int l=L,r=R;
for(int i=L;i<=R;i++){
if(i&1){if(pre[l]<L&&nxt[l]>R)return(check(L,l-1)&&check(l+1,R));l++;}
else{if(pre[r]<L&&nxt[r]>R)return(check(L,r-1)&&check(r+1,R));r--;}
}return 0;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
map<int,int> M;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
nxt[M[a[i]]]=i;
pre[i]=M[a[i]];
M[a[i]]=i;
}for(int i=1;i<=n;i++)nxt[M[a[i]]]=n+1;
if(check(1,n))puts("non-boring");
else puts("boring");
}return 0;
}

BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)的更多相关文章

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

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

  2. 【刷题】BZOJ 4059 [Cerc2012]Non-boring sequences

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

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

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

  4. Non-boring sequences(启发式分治)

    题意:一个序列被称作是不无聊的,当且仅当,任意一个连续子区间,存在一个数字只出现了一次,问给定序列是否是不无聊的. 思路:每次找到一个只出现了一次的点,其位置的pos,那么继续分治[L,pos-1], ...

  5. HDU6701:Make Rounddog Happy(启发式分治)

    题意:给定数组a[],求区间个数,满足区间的数各不同,而且满足maxval-len<=K: 思路:一看就可以分治做,对于当前的区间,从max位置分治. 对于这一层,需要高效的统计答案,那么对短的 ...

  6. 【BZOJ 4059】 (分治暴力|扫描线+线段树)

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

  7. Removing Stones(2019年牛客多校第三场G+启发式分治)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时有\(n\)堆石子,每堆石子的石子个数为\(a_i\),然后进行游戏. 游戏规则为你可以选择任意两堆石子,然后从这两堆中移除一个石子,最 ...

  8. Make Rounddog Happy(2019年杭电多校第十场1011+HDU6701+启发式分治)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 求有多少个子区间满足\(a_l,a_{l+1},\dots,a_r\)均不相同且\(max(a_l,a_{l+1},\dots,a_r)-(r ...

  9. 2019牛客暑期多校训练营(第三场)G: Removing Stones(启发式分治)

    题意:给定N,表示N堆石子,每堆石子数为a[],问多少个区间,可以满足“石子总和若为偶数,那么可以两两取来自不同堆的石子,直到取完: 如果为奇数,那么排除其中一个,然后可以两两取来自不同堆的石子,直到 ...

随机推荐

  1. 多种方法过Codeforces Round #270的A题(奇偶法、打表法和Miller_Rabin(这个方法才是重点))

    题目链接:http://codeforces.com/contest/472/problem/A 题目: 题意:哥德巴赫猜想是:一个大于2的素数一定可以表示为两个素数的和.此题则是将其修改为:一个大于 ...

  2. div圆角

    div{    -moz-border-radius: 10px;    -webkit-border-radius: 10px;    border-radius: 10px;}

  3. IOException while loading persisted sessions:

    严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException at java. ...

  4. bootstrap-table组合表头

    1.效果图 2.html代码 <table id="table"></table> 3.javascript代码 $("#table") ...

  5. Java爬取网易云音乐民谣并导入Excel分析

    前言 考虑到这里有很多人没有接触过Java网络爬虫,所以我会从很基础的Jsoup分析HttpClient获取的网页讲起.了解这些东西可以直接看后面的"正式进入案例",跳过前面这些基 ...

  6. rabbitmq之核心构架和原理总结(四)

    前言 前面博文已经将安装配置和站点管理介绍了,现在开始正式学习rabbitmq的使用了: rabbitMQ的构架 rabbitmq作为消息队列,一条消息从发布到订阅消费的完整流程为: 消息 --> ...

  7. [device tree] interrupt

    Specifying interrupt information for devices ============================================ 1) Interru ...

  8. free函数在操作系统内存中的实现【转】

    转自:http://www.2cto.com/kf/201210/160985.html 我一次性malloc十个单位节点的内存空间出来赋值给L, 现在我想一次性删除从第3个到第6个节点,我是这么做的 ...

  9. service XXX start启动报start: Rejected send message, 1 matche

    转,原文地址:http://blog.sina.com.cn/s/blog_56d8ea9001018w1l.html [问题]start: Rejected send messag现象:crifan ...

  10. JDBC数据源连接池(1)---DBCP

    何为数据源呢?也就是数据的来源.我在前面的一篇文章<JDBC原生数据库连接>中,采用了mysql数据库,数据来源于mysql,那么mysql就是一种数据源.在实际工作中,除了mysql,往 ...