【BZOJ 4059】 (分治暴力|扫描线+线段树)
4059: [Cerc2012]Non-boring sequences
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 632 Solved: 227Description
我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短。一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次。给定一个整数序列,请你判断它是不是不无聊的。
Input
第一行一个正整数T,表示有T组数据。每组数据第一行一个正整数n,表示序列的长度,1 <= n <= 200000。接下来一行n个不超过10^9的非负整数,表示这个序列。
Output
对于每组数据输出一行,输出"non-boring"表示这个序列不无聊,输出"boring"表示这个序列无聊。
Sample Input
4
5
1 2 3 4 5
5
1 1 1 1 1
5
1 2 3 2 1
5
1 1 2 1 1Sample Output
non-boring
boring
non-boring
boringHINT
Source
【分析】
这题我是不会往扫描线方向想的。感觉很神奇。
首先对于每个a[i]求前一个同色的位置$last$和后一个的位置$next$,显然左端点在[last+1,i]右端点在[i,next-1]的都是可以的。
那么把左端点当成x,右端点当成y,区间就表示成了平面上的一个点,可行区间集就是一个矩形,最后看看n个矩形是否把上三角覆盖。
【这个把这题复杂化了,其实有更简单的方法所以我没打这个哦
很容易想到暴力。
如果序列non-boring,必定有一个数值只出现了一次,找到他的位置i【可能有多个,先随便找一个】,
那么区间跨越i的都可以的嘛,所以只需判断[l,i-1]和[i+1,r]即可。
就把区间分治了。
但是时间复杂度???
网上的神犇们说,从左右两端向中间暴力枚举,用$next$和$last$$O(1)$判断即可。
是nlogn的。
因为:$T(n)=max{T(k)+T(n-k)+min(n,n-k)}=O(nlogn)$
直观证明:
我们考虑每个对时间复杂度有贡献的下标,它一定属于两段中比较小的那一段,于是。。
每次每个下标被算一次,它的所在块就会缩小一倍,那么显然每个下标的贡献就是O(logn),它的总时间复杂度就是O(nlogn)。
ORZORZ。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 200010 struct node{int x,id;}t[Maxn];
bool cmp(node x,node y) {return x.x<y.x;}
int a[Maxn],nt[Maxn],lt[Maxn],ft[Maxn]; bool ffind(int l,int r)
{
if(l>=r) return ;
int t=-;
for(int i=;i<=r-l+;i++)
{
if(l+i>r-i) break;
if(nt[l+i]>r&<[l+i]<l) {t=l+i;break;}
if(nt[r-i]>r&<[r-i]<l) {t=r-i;break;}
}
if(t==-) return ;
return ffind(l,t-)&&ffind(t+,r);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&t[i].x);t[i].id=i;
}
sort(t+,t++n,cmp);
a[t[].id]=;int p=;
for(int i=;i<=n;i++)
{
if(t[i].x!=t[i-].x) p++;
a[t[i].id]=p;
}
for(int i=;i<=p;i++) ft[i]=n+;
for(int i=n;i>=;i--) nt[i]=ft[a[i]],ft[a[i]]=i;
for(int i=;i<=p;i++) ft[i]=;
for(int i=;i<=n;i++) lt[i]=ft[a[i]],ft[a[i]]=i;
if(ffind(,n)) printf("non-boring\n");
else printf("boring\n");
}
return ;
}
2017-04-25 08:38:03
【BZOJ 4059】 (分治暴力|扫描线+线段树)的更多相关文章
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)
Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...
- CodeForce 855B 暴力or线段树
CodeForce 855B 暴力or线段树 题意 给你一串数,然后找出三个数,他们的前后关系和原来一样,可以相同,然后分别乘p,q,r,求他们积的和最大,并且输出这个数. 解题思路 这个可以使用线段 ...
- [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)
[BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
随机推荐
- Java基础-进制转换
Java基础-进制转换 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Java 程序中常用的进制 1>.十进制,由“0123456789” 这10个数字组成,逢十进一: ...
- CCNA学习与实验指南——第2章 网络互联和参考模型
大三下学期的这个时间段,不知道是不是社会就业的恐惧与自身前途的迷茫所带来的压力,身边的同学一个个的整天奔赴考研室学的好不努力,空荡荡的宿舍只剩我一人孑然聊聊甚是索然无味,亦或许是即将毕业的压力等接踵而 ...
- properties编程示例
package com.lovo.props; import java.io.FileInputStream;import java.io.FileNotFoundException;import j ...
- centos内存自动清理脚本及限制tomcat内存占用
使用crontab定时每天自动清理系统内存 00 00 * * * /root/Cached.sh [root@localhost ~]# cat Cachec.sh #! /bin/bash# ca ...
- bzoj千题计划246:bzoj2242: [SDOI2011]计算器
http://www.lydsy.com/JudgeOnline/problem.php?id=2242 #include<map> #include<cmath> #incl ...
- HDU 1730 类NIM模型
两者间的间距就是可取石子数,因为对于行内黑白相连的局面该子游戏已经结束了因为此时不管先手再怎么移都是必败,SG=0的终止态 /** @Date : 2017-10-14 21:46:21 * @Fil ...
- 用Java构建一个简单的WebSocket聊天项目之新增HTTP接口调度
采用框架 我们整个Demo基本不需要大家花费太多时间,就可以实现以下的功能. 用户token登录校验 自我聊天 点对点聊天 群聊 获取在线用户数与用户标签列表 发送系统通知 首先,我们需要介绍一下我们 ...
- Verilog笔记.三段式状态机
之前都是用的一段式状态机,逻辑与输出混在一起,复杂点的就比较吃力了. 所以就开始着手三段式状态机. 组合逻辑与时序逻辑分开,这样就能简单许多了. 但是两者在思考方式上也有着很大的区别. 三段式,分作: ...
- linux 串口驱动(三) 【转】
转自:http://blog.chinaunix.net/uid-27717694-id-3495825.html 三.串口的打开在用户空间执行open操作的时候,就会执行uart_ops->o ...
- Python学习四|变量、对象、引用的介绍
变量 变量创建:一个变量也就是变量名,就像a,当代码第一次赋值时就创建了它.之后的赋值将会改变已创建的变量名的值,从技术上讲,Python在代码运行之前先检测变量名,可以当成是最初的赋值创建了变量. ...