如果一个序列中是否存在一段连续子序列中的每个元素在该子序列中都出现了至少两次,那么这个序列是无聊的,反正则不无聊。给你一个长度为n(n<=200000)的序列,判断这个序列是否无聊。

稀里糊涂AC的一道题。

如果一个序列不无聊,那么一定至少存在一个独一无二的元素。如果找到了该元素,那么只需分别判断该元素两侧的子序列是否无聊即可。找到一个独一无二的元素的期望时间复杂度为$O(n)$(n为当前序列长度),显然如果该独一无二的元素在中间的话,则复杂度$T(n)=2T(n/2)+O(n)=O(nlogn)$,但假如比较靠边的话,情况就有些尴尬了,最坏情况下复杂度为$O(n^2)$。解决方法是从两边向中间找,这样的话复杂度就成了$T(n)=max\{T(k)+T(n-k)+min(k,n-k)\}$,比较玄学,据说是$O(nlogn)$的,但我不会证明QAQ,而且不知道为啥一样的代码逻辑,很多都跑了100+ms,而我的却跑了2500+ms,勉强过掉...

 #include<bits/stdc++.h>

 using namespace std;
typedef long long ll;
const int N=2e5+;
int n,a[N],b[N],c[N],nn,pre[N],nxt[N],last[N]; void disc(int* a,int n) {
for(int i=; i<n; ++i)b[i]=a[i];
sort(b,b+n);
nn=unique(b,b+n)-b;
for(int i=; i<n; ++i)a[i]=lower_bound(b,b+nn,a[i])-b;
} int uni(int i,int l,int r) {return pre[i]<l&&nxt[i]>r;} int solve(int l,int r) {
if(l>=r)return ;
int mid=-;
for(int L=l,R=r; L<=R; ++L,--R) {
if(uni(L,l,r)) {mid=L; break;}
if(uni(R,l,r)) {mid=R; break;}
}
if(mid==-)return ;
return solve(l,mid-)&&solve(mid+,r);
} int main() {
int T;
for(scanf("%d",&T); T--;) {
scanf("%d",&n);
for(int i=; i<n; ++i)scanf("%d",&a[i]);
disc(a,n);
memset(last,-,sizeof last);
for(int i=; i<n; ++i) {
pre[i]=last[a[i]],last[a[i]]=i,nxt[i]=n;
if(~pre[i])nxt[pre[i]]=i;
}
puts(solve(,n-)?"non-boring":"boring");
}
return ;
}

UVA - 1608 Non-boring sequences (分治,中途相遇法)的更多相关文章

  1. uva 6757 Cup of Cowards(中途相遇法,貌似)

    uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...

  2. UVa 1326 - Jurassic Remains(枚举子集+中途相遇法)

    训练指南p.59 #include <cstdio> #include <cstring> #include <cstdlib> #include <map& ...

  3. 紫书 例题8-3 UVa 1152(中途相遇法)

    这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...

  4. 紫书 习题 8-16 UVa 1618 (中途相遇法)

    暴力n的四次方, 然而可以用中途相遇法的思想, 分左边两个数和右边两个数来判断, 最后合起来判断. 一边是n平方logn, 合起来是n平方logn(枚举n平方, 二分logn) (1)两种比较方式是相 ...

  5. 【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)

    题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ...

  6. LA 2965 Jurassic Remains (中途相遇法)

    Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...

  7. HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))

    Difference Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  9. 高效算法——J 中途相遇法,求和

    ---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su ...

  10. 【UVALive】2965 Jurassic Remains(中途相遇法)

    题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...

随机推荐

  1. predis操作大全

    predis是php连接redis的操作库,由于它完全使用php编写,大量使用命名空间以及闭包等功能,只支持php5.3以上版本,故实测性能一般,每秒25000次读写,相信改换c语言编写的php扩展后 ...

  2. iOS 当公司有人向你提问,你该如何应对?

    今天 因为iOS 开发的内部版本号耿耿于怀好久,释然后让我有了一个新想法:从前,能让我兴奋的点是解决一个有一个拗脑筋的问题,见大部分博客便知,都是技术方面的积累. 那么从今天起我决定让自己有个新起点, ...

  3. for语句中多重定义

    "}; vector<string> vecStr(Arr, Arr + sizeof(Arr)/sizeof(string)); , sz = vecStr.size(); i ...

  4. HTTP学习笔记05-首部

    首部和方法配合工作共同决定了客户端和服务器能做些什么事情. 首部可以出现在请求和响应报文中,大致来分的话,可以分为那么5种: 通用首部: request和response报文都可以使用的首部. 比如 ...

  5. 机器学习算法之:KNN

    基于实例的学习方法中,最近邻法和局部加权回归法用于逼近实值或离散目标函数,基于案例的推理已经被应用到很多任务中,比如,在咨询台上存储和复用过去的经验:根据以前的法律案件进行推理:通过复用以前求解的问题 ...

  6. php自带函数去除html标记

    strip_tags 去掉 HTML 及 PHP 的标记. 语法: string strip_tags(string str); 传回值: 字串 函式种类: 资料处理 内容说明 本函式可去掉字串中包含 ...

  7. CSS3透明背景表单

    在线演示 本地下载

  8. 20145230《java程序设计》第五次实验报告

    20145230实验五 Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 本次实验我负责编写客户端代码的编写,以下是我实验进行的步骤: ...

  9. Redux API之bindActionCreators

    bindActionCreators(actionCreators,dispatch) 把 action creators 转成拥有同名 keys 的对象,但使用 dispatch 把每个 actio ...

  10. java——base64 加密和解密

    base64 一.加密 *.若有要求输入字符必须为UTF-8: 则需str.getByte("utf-8");  //在getByte()中指定utf-8编码,否则中文字符将被加密 ...