[cerc2012][Gym100624D]20181013

题意:一个序列,如果存在一个连续子序列,满足该子序列中没有只存在一次的序列,则原序列为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的更多相关文章
- [cerc2012][Gym100624C]20181013
题意:用元素符号表示字符串 题解:签到题 简单dp 难点在于把元素符号都改成小写qaq #include<cstdio> #include<cstdlib> #include& ...
- [cerc2012][Gym100624B]20181013
- [cerc2012][Gym100624A]20181013
A 题意:n(n<=20)个国家,每个国家之间有一些债务关系,总体为负债的国家会破产,破产国家的债务关系全部消除.问哪些国家可能成为最后一个唯一存在的国家. 题解: 对于每一个状态,面对若干个负 ...
- BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )
状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ...
- BZOJ 4059: [Cerc2012]Non-boring sequences ( )
要快速在一段子序列中判断一个元素是否只出现一次 , 我们可以预处理出每个元素左边和右边最近的相同元素的位置 , 这样就可以 O( 1 ) 判断. 考虑一段序列 [ l , r ] , 假如我们找到了序 ...
- 4063: [Cerc2012]Darts
4063: [Cerc2012]Darts Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 85 Solved: 53[Submit][Status] ...
- 【BZOJ4061】[Cerc2012]Farm and factory(最短路,构造)
[BZOJ4061][Cerc2012]Farm and factory(最短路,构造) 题面 BZOJ 然而权限题QwQ. 题解 先求出所有点到达\(1,2\)的最短路,不妨记为\(d_{u,1}, ...
- 2018-10-13 21:30:51 conversion of number systems
2018-10-13 21:30:51 c language 二进制.八进制和十六进制: 1) 整数部分 十进制整数转换为 N 进制整数采用“除 N 取余,逆序排列”法. 十进制数字 36926 转 ...
- 4525: [Cerc2012]Kingdoms
4525: [Cerc2012]Kingdoms 题意 n个国家,两两之间可能存在欠债或者被欠债的关系,一个国家破产:其支出大于收入.问一个国家能否坚持到最后. 思路 很有意思的一道题. dp[s]表 ...
随机推荐
- BluetoothSocket详解
一. BluetoothSocket简介 1. 简介 客户端与服务端 : BluetoothSocket 和 BluetoothServerSocket 类似于Java中的套接字的 Socket 和 ...
- JavaScript初探系列之面向对象
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...
- win7主题/默认账户图片路径
账户图片位置 C:\ProgramData\Microsoft\User Account Pictures 主题位置 C:\Windows\Resources
- Python运算符与编码
阅读目录 while 循环 运算符 编码的问题 单位转换 整数 布尔值 while 循环 在生活中,我们遇到过循环的事情吧?比如循环听歌.在程序中,也是存才的,这就是流程控制语句 while 1.基本 ...
- [剑指Offer] 58.对称的二叉树
题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. [思路]递归,关键是isSame函数中的最后一句 /* struct Tree ...
- 如何取得dbgrid中未保存(post)的值(50分)
比如说处在编辑状态时,想取得当前记录值 Dataset.fields[0].Value 就是当前值:Dataset.fields[0].OldValue 就是原始值. 呵呵,我指得是在编辑时,就是按键 ...
- bsxfun函数
函数功能:两个数组间元素逐个计算的二值操作 使用方法:C=bsxfun(fun,A,B) 两个数组A合B间元素逐个计算的二值操作,fun是函数句柄或者m文件,也可以为如下内置函数: @plus 加@m ...
- BZOJ 1055 玩具取名(区间DP)
很显然的区间DP,定义dp[i][j][k], 如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符. # include <cstdio> # include <cst ...
- Android命名格式化详解
严格换行 一般情况下一个“:”一换行 建议函数的“{}”分别占一行 例:public void ooSomething() { …… } 不要用: 例:public void doSomething ...
- POJ2318:TOYS——题解
http://poj.org/problem?id=2318 题目大意:给一个大矩形,分成n+1份,求落在每一份的点的数量. —————————————————— 首先叉积可以判断一个点在边界的左边还 ...