bzoj4059 [Cerc2012]Non-boring sequences
传送门: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的更多相关文章
- 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
这个做法名字是从武爷爷那里看到的…… Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子 ...
- BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)
这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...
- 【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree
和bzoj4059: [Cerc2012]Non-boring sequences非常相似 Description 一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且 ...
- 【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 ] , 假如我们找到了序 ...
- 【BZOJ4059】Non-boring sequences(分析时间复杂度)
题目: BZOJ4059 分析: 想了半天没什么想法,百度到一个神仙做法-- 设原数列为 \(a\),对于每一个 \(i\) 求出前一个和后一个和 \(a_i\) 相等的位置 \(pre[i]\) 和 ...
- [Cerc2012]Non-boring sequences
Description 定义一个序列是不无聊的,当且仅当它的所有子区间都存在一个独一无二的数字,即每个子区间里至少存在一个数字只出现过一次.给定一个长度为\(N(N\leq2\times 10^5)\ ...
随机推荐
- [BZOJ4196]软件包管理器(树链剖分)
[BZOJ4196] install x-> 询问根节点到x路径上0的个数,然后全变1 uninstall x-> 询问x子树(包括x)中1的个数,然后全边0 Code #include ...
- Git-Git克隆
鸡蛋不装在一个篮子里 Git的版本库目录和工作区在一起,因此存在一损俱损的问题,即如果删除一个项目的工作区,同时也会把这个项目的版本库删除掉.一个项目仅在一个工作区中维护太危险了,如果有两个工作区就会 ...
- Sqoop 工具使用
Sqoop 是什么及安装 Hadoop sqoop Apache sqoop (SQL to Hadoop) Sqoop is a tool designed to transfer data bet ...
- MySQL 5.7远程连接
将/etc/mysql/my.cnf中的bind_address那一行注释掉或修改为"bind_address=0.0.0.0": bind_address并没有在/etc/mys ...
- 6 URL 实习文章链接跳转
需要解决的三个问题? . 1.不够多的URL (1)正则表达式 (2)\d 数字 /detail/123 /detail/(\d){3} #限定3个数字 /detail/(\d+) #限定多个数字 ( ...
- 03019_过滤器Filter
1.Filter的简介 (1)Filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理: (2)快速入门步骤 ①编写一个过滤器的类实现Filter接 ...
- convlstm学习资料
https://guanfuchen.github.io/post/markdown_blog_ws/markdown_blog_2017_11/convolutional_lstm_network_ ...
- 《Cracking the Coding Interview》——第6章:智力题——题目5
2014-03-20 01:08 题目:扔鸡蛋问题.有一个鸡蛋,如果从N楼扔下去恰好会摔碎,低于N楼则不碎,可以继续扔.给你两个这样的鸡蛋,要求你一定得求出N,怎么扔才能减少最坏情况下的扔的次数? 解 ...
- 程序员必备PC维修法(硬件篇)
自检自修不是万能,但不会自检自修却万万不能.程序员修电脑还是有必要的. 情景:通电情况下,电脑主机无法启动,所有主机内部硬件无反应. 原因:1.CPU.主板.电源积尘.(出现率30%) 2.CPU.主 ...
- Synology DS213J 群晖NAS git server架设方法!
最近单位购入一台Synology DS213J用作数据存储. 本人打算将一些项目的源代码也放在上面,他本身的套件中心提供了SVN SERVER和GIT SERVER. 设置SVN SERVER非常简 ...