【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences
这个做法名字是从武爷爷那里看到的……
Description
我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短。一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次。给定一个整数序列,请你判断它是不是不无聊的。
Input
第一行一个正整数T,表示有T组数据。每组数据第一行一个正整数n,表示序列的长度,1 <= n <= 200000。接下来一行n个不超过10^9的非负整数,表示这个序列。
Output
对于每组数据输出一行,输出"non-boring"表示这个序列不无聊,输出"boring"表示这个序列无聊。
Sample Input
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
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的更多相关文章
- 【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree
和bzoj4059: [Cerc2012]Non-boring sequences非常相似 Description 一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且 ...
- 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 ...
- bzoj4059 [Cerc2012]Non-boring sequences
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题解] 考虑分治.定义过程solve(l,r)为判断全在[l,r]范围内的所有连续子 ...
- BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)
这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...
- BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的 ...
- BZOJ 4059: [Cerc2012]Non-boring sequences(启发式分治)
传送门 解题思路 首先可以想到要预处理一个\(nxt_i\)和\(pre_i\),表示前后与当前位置权值相同的节点,那么这样可以迅速算出某个点在某段区间是否出现多次.然后这样的话就考虑分治,对于\([ ...
- 【bzoj4059】[Cerc2012]Non-boring sequences 分治
题目描述 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列, ...
- 【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)
4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 440 Solved: 16 ...
- BZOJ 4059: [Cerc2012]Non-boring sequences ( )
要快速在一段子序列中判断一个元素是否只出现一次 , 我们可以预处理出每个元素左边和右边最近的相同元素的位置 , 这样就可以 O( 1 ) 判断. 考虑一段序列 [ l , r ] , 假如我们找到了序 ...
随机推荐
- PJzhang:安全小课堂-安全软件为什么很重要,看这里!
猫宁!!! 参考链接: http://www.360.cn/webzhuanti/mianyigongju.html https://www.freebuf.com/fevents/204100.ht ...
- shell学习(10)- if的使用
在写Linux脚本的时候,经常会用到判断,这篇主要讲if的具体使用. if用法: if [ ] ;then command elif [ ] ;then command else command fi ...
- shell编程 Shell script 的默认变量($0, $1...)
Shell script 的默认变量($0, $1...) 我们知道指令可以带有选项与参数,例如 ls -la 可以察看包含隐藏文件的所有属性与权限.那么 shell script 能不能在脚本文件名 ...
- 补充:jQuery的ajax
一.jQuery的ajax 什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJA ...
- python的入门1(补发)
一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
- NET Core 模块化,多租户框架
NET Core 模块化,多租户框架 Orchard Core Framework:ASP.NET Core 模块化,多租户框架 上一篇编写Orchard Core一分钟搭建ASP.NET Core ...
- HDU 5875 H - Function 用单调栈水过了
http://acm.hdu.edu.cn/showproblem.php?pid=5875 单调栈,预处理to[i]表示第一个比a[i]小的数字,一直跳就可以. 这题是数据水而已. 这里学习下单调栈 ...
- Jenkins+Gitlab+Ansible自动化部署(六)
Pipeline Job实现Nginix+MySQL+PHP+Wordpress实现自动化部署交付(Jenkins+Gitlab+Ansible自动化部署(五)https://www.cnblogs. ...
- 机器学习框架ML.NET学习笔记【9】自动学习
一.概述 本篇我们首先通过回归算法实现一个葡萄酒品质预测的程序,然后通过AutoML的方法再重新实现,通过对比两种实现方式来学习AutoML的应用. 首先数据集来自于竞赛网站kaggle.com的UC ...
- oo第三单元总结
JML梳理 1. JM语法一般结构 public instance //jml中操作数据,并不要求实现 public invariant //不变式 public constraint //约束 no ...