题意:一个序列,如果存在一个连续子序列,满足该子序列中没有只存在一次的序列,则原序列为boring,否则non-boring

题解:

分治递归

对一个序列,如果找到了一个只出现一次的数位于a[x],则问题转化为子序列a[1]...a[x-1]和a[x+1]..a[len]这两个序列有没有boring序列,故分治。

判断a[x]是否是在这个数列中只出现一次:记录左边最近一次出现a[x]的位置l[x],右边为r[x],若数列为a[L]...a[R],则l[x]<L&&r[x]>R

找a[x]:

从两边向中间找,最坏情况为每次从两边找到中间,T(n)=T(n/2)+O(n) --> O(nlogn)
从中间向两边找,最坏情况为每次从中间找到两边,T(n)=T(n-1)+O(n) --> O(n^2)

 /*
从两边向中间找,最坏情况为每次从两边找到中间,T(n)=T(n/2)+O(n) --> O(nlogn)
从中间向两边找,最坏情况为每次从中间找到两边,T(n)=T(n-1)+O(n) --> O(n^2)
*/ #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
using namespace std; const int N=;
int a[N],l[N],r[N],id[N];
struct node{
int d,id;
}p[N]; bool cmp(node x,node y){return x.d<y.d;} bool find_one(int L,int R)
{
if(L>R) return ;
int mid=(L+R)/;
int t=,x;
for(int i=;;i++)
{
if(L+i<=R && l[L+i]<L && r[L+i]>R) return find_one(L,L+i-) || find_one(L+i+,R);
if(R-i>=L && l[R-i]<L && r[R-i]>R) return find_one(L,R-i-) || find_one(R-i+,R);
if(L+i>R && R-i<L) break;
}
/*
//从中间向两边找 tle
while(mid+t<=R || mid-t>=L)
{
if(mid+t<=R)
{
x=mid+t;
if(l[x]<L && r[x]>R) return find_one(L,x-1) || find_one(x+1,R);
}
if(mid-t>=L)
{
x=mid-t;
if(l[x]<L && r[x]>R) return find_one(L,x-1) || find_one(x+1,R);
}
t++;
}
*/
return ; } int main()
{
//freopen("a.in","r",stdin);
int n,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n); for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
p[i].d=a[i];
p[i].id=i;
}
sort(p+,p++n,cmp);
int pre=-,num=;
for(int i=;i<=n;i++)
{
if(p[i].d!=pre) num++;
pre=p[i].d;
a[p[i].id]=num;
}
memset(id,,sizeof(id));
for(int i=;i<=n;i++)
{
l[i]=id[a[i]];
id[a[i]]=i;
}
for(int i=;i<=n;i++) id[a[i]]=n+;
for(int i=n;i>=;i--)
{
r[i]=id[a[i]];
id[a[i]]=i;
}
if(find_one(,n)) printf("boring\n");
else printf("non-boring\n");
}
return ;
}

[cerc2012][Gym100624D]20181013的更多相关文章

  1. [cerc2012][Gym100624C]20181013

    题意:用元素符号表示字符串 题解:签到题 简单dp 难点在于把元素符号都改成小写qaq #include<cstdio> #include<cstdlib> #include& ...

  2. [cerc2012][Gym100624B]20181013

  3. [cerc2012][Gym100624A]20181013

    A 题意:n(n<=20)个国家,每个国家之间有一些债务关系,总体为负债的国家会破产,破产国家的债务关系全部消除.问哪些国家可能成为最后一个唯一存在的国家. 题解: 对于每一个状态,面对若干个负 ...

  4. BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )

    状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ...

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

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

  6. 4063: [Cerc2012]Darts

    4063: [Cerc2012]Darts Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 85  Solved: 53[Submit][Status] ...

  7. 【BZOJ4061】[Cerc2012]Farm and factory(最短路,构造)

    [BZOJ4061][Cerc2012]Farm and factory(最短路,构造) 题面 BZOJ 然而权限题QwQ. 题解 先求出所有点到达\(1,2\)的最短路,不妨记为\(d_{u,1}, ...

  8. 2018-10-13 21:30:51 conversion of number systems

    2018-10-13 21:30:51  c language 二进制.八进制和十六进制: 1) 整数部分 十进制整数转换为 N 进制整数采用“除 N 取余,逆序排列”法. 十进制数字 36926 转 ...

  9. 4525: [Cerc2012]Kingdoms

    4525: [Cerc2012]Kingdoms 题意 n个国家,两两之间可能存在欠债或者被欠债的关系,一个国家破产:其支出大于收入.问一个国家能否坚持到最后. 思路 很有意思的一道题. dp[s]表 ...

随机推荐

  1. PHPCMS v9表单向导中怎么加入验证码

    表单想到比较简单,所以没有加入验证码的功能.网上的类似教程又大多数不准确.所以亲自测试了一下,发现下面的方法是可用的.希望对有需求的朋友们有所帮助. 1.首先是调用表单的页面加入验证码.表单js调用模 ...

  2. PHPCMS调取当前栏目的描述、文章位置导航、当前栏目链接、当前栏目名称

    当我们填写了栏目描述,怎么调用出来. 使用 {$CATEGORYS[$catid][description]} 就可以把栏目的描述调用出来 下面三个也比较常用{catpos($catid)} 显示文章 ...

  3. c#积累之测试

    初来上班,免不了看别人代码.快速搞懂别人代码是我现在受到的一大挑战.寻摸着规律,发现一边进行调试,一边进行行行注释的逻辑判断不失为一种妙招. c#调试用的是vs2012.f11键和f10和f5键的应用 ...

  4. iOS- 如何将非ARC的项目转换成ARC项目(实战)

    1.前言   因为公司有个国外餐饮系统,编程开发了3-4年,之前用的都是非ARC,开发到今年,第一批迭代开发的人员早已不见,目前发现了有许多的内存泄露之类的,系统没有自动释放该释放的内存.一旦app长 ...

  5. 统一日志系统 Log4Net/ExceptionLess

    一.   写在前面 本文Log4Net介绍了基础的方式,大数据量生产环境不能使用,中等日志量请日志单库. 希望爱技术的你不要错过exceptionless和ELK 第四节开始简单配置大牛们推荐的了Ex ...

  6. 配置apt-get告诉下载源

    本文转自:http://blog.csdn.net/hyl1718/article/details/7915296 方法: 1.修改源地址: cp /etc/apt/sources.list /etc ...

  7. 【bzoj2073】[POI2004]PRZ 状态压缩dp

    题目描述 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批 ...

  8. 前端基础:JavaScript介绍

    JavaScript介绍 一.JavaScript简介 1.在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现二层,因为Netscape与Sun合作,N ...

  9. Codeforces 1025D(区间dp)

    容易想到设f[i][j][k]为i~j区间以k为根是否能构成bst.这样是O(n4)的.考虑将状态改为f[i][j][0/1]表示i~j区间以i-1/j+1为根能否构成bst.显然如果是i-1作为根的 ...

  10. Codeforces Round #469 (Div. 2) F. Curfew

    贪心 题目大意,有2个宿管分别从1和n开始检查房间,记录人数不为n的房间个数,然后锁住房间. 没有被锁的房间中的学生可以选择藏在床底,留在原地,或者转移(最远转移d个房间)   然后抄了网上大神的代码 ...