传送门: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. Python学习第一弹

    开发语言: 高级:Python.java.PHP  C#   GO  ruby   C++           ——>字节码   低级:C.汇编                          ...

  2. python如果想输出原格式的内容,可以加''' ''',占位符使用方式

    print('我考了%d分'%20) msg=''' ---------info of %s----------- name: %s age: %d #字符串不能放到%d处 job: %s salar ...

  3. sap对字符串的操作

    REPLACE  替换字段内容 TRANSLATE 转换大/小写 FIND FIRST OCCURRENCE OF 查找字符串 替换字段内容 REPLACE [FIRST /ALL OCCURRENC ...

  4. CentOS 使用 LAMP 环境开启 SSL 搭建 WordPress

    环境阿里云新装CentOS 7.4, 使用yum(非编译安装)搭建LAMP, CA证书为阿里云免费提供的, WordPress为官网下载 安装 LAMP 并开启 HTTPS 1, 关闭防火墙 # sy ...

  5. Android 懒加载简单介绍

    1.懒加载介绍 1.1.效果预览 1.2.效果讲解 当页面可见的时候,才加载当前页面. 没有打开的页面,就不会预加载. 说白了,懒加载就是可见的时候才去请求数据. 1.3.懒加载文章传送门 参考文章: ...

  6. 十四、pymysql模块

    一.安装的两种方法 第一种 #安装 pip3 install pymysql 第二种 二.链接,执行sql,关闭(游标) import pymysql user= input('用户名:>> ...

  7. P2341 [HAOI2006]受欢迎的牛(tarjan+缩点)

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...

  8. 设置虚拟wifi,手机和电脑可以连接

    在家里没有wifi,笔记本电脑又是宽带连接,有时候手机流量用得很快,于是网上找了一下设置虚拟wifi 方法. 1.首先你的电脑上要有无线网卡,并且无线网上一定要是开户的,一般默认的都开启,如果没有开启 ...

  9. Java 遍历Map集合的方法

    方法一:通过Map.keySet,遍历key和value Map<String, Object> map = new HashMap<>(); for (String key ...

  10. python3 虚拟环境配置

    CentOS7 python3 虚拟环境配置 1. 安装依赖包 yum -y install wget gcc epel-release git 2. 安装 Python3.6 yum -y inst ...