BZOJ 4059 Non-boring sequences

原来要从两边开始for啊。。。。。感谢http://blog.csdn.net/XY20130630/article/details/50635756

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define maxn 200500
using namespace std;
int t,n,a[maxn],aft[maxn],pre[maxn];
map <int,int> p,q;
bool check(int l,int r)
{
    if (l>=r) return true;
    int p1=l,p2=r;
    while (p1<=p2)
    {
        if ((pre[p1]<l) && (aft[p1]>r)) return check(l,p1-1)&&check(p1+1,r);
        if ((pre[p2]<l) && (aft[p2]>r)) return check(l,p2-1)&&check(p2+1,r);
        p1++;p2--;
    }
    return false;
}
void work()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    p.clear();q.clear();
    for (int i=1;i<=n;i++)
    {
        if (!p.count(a[i])) pre[i]=0;
        else pre[i]=p[a[i]];
        p[a[i]]=i;
    }
    for (int i=n;i>=1;i--)
    {
        if (!q.count(a[i])) aft[i]=n+1;
        else aft[i]=q[a[i]];
        q[a[i]]=i;
    }
    if (check(1,n)) printf("non-boring\n");
    else printf("boring\n");
}
int main()
{
    scanf("%d",&t);
    for (int i=1;i<=t;i++)
        work();
    return 0;
}
时间: 2024-11-02 18:38:06

BZOJ 4059 Non-boring sequences的相关文章

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

要快速在一段子序列中判断一个元素是否只出现一次 , 我们可以预处理出每个元素左边和右边最近的相同元素的位置 , 这样就可以 O( 1 ) 判断. 考虑一段序列 [ l , r ] , 假如我们找到了序列中唯一元素的位置 p , 那我们只需检查 [ l , p - 1 ] & [ p + 1 , r ] 是否 non-boring 即可 . 如何检查 序列 [ l , r ] 呢 ? 假如从左往右或者从右往左找 , 最坏情况下是 O( n ) , 总时间复杂度会变成 O( n² ) ; 假如我们从

BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字, 即每个子序列里至少存在一个数字只出现一次. 给定一个整数序列,请你判断它是不是不无聊的. [题解] 预处理每个元素上一次出现位置和下一个出现位置, 我们发现对于一个子序列[L,R]来说, 如果存在pre[i]<L&&nxt[i]>R那么这个子序列一定是满足条件的, 否则就不

BZOJ 4059 Cerc2012 Non-boring sequences 线段树+扫描线

题目大意:定义一个序列为[不无聊的]当且仅当这个序列的任意一个区间都存在一个数只出现过一次,给定一个序列,要求判断这个序列是否是[不无聊的] 定义lasti表示第i个元素上一次出现的位置(第一次出现则为0),nexti表示第i个元素下一次出现的位置(最后一次出现则为n+1),那么这个元素能成为某个区间仅出现一次的数,当且仅当这个区间的左端点在[lasti+1,i]之间,右端点在[i,nexti?1]之间 我们可以将区间的左右端点放在二维平面上,那么一个元素产生的贡献是一个矩形,我们要确定的是所有

【BZOJ 4059】 (分治暴力|扫描线+线段树)

4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 632  Solved: 227 Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列,请你判断它是不是不无聊的. Input 第一行一个正整数T,表示有T组数据.每组数

【专题】偏序,扫描线

[关键字]偏序,数点,树状数组,线段树,扫描线. 因为涉及多种算法,所以整合到一起. [扫描线] 二维数点,偏序 ★数点问题 ★关于偏序问题的一些总结 一维偏序:排序二分 树状数组 二维偏序:排序扫描线+树状数组(差分)/线段树 三维偏序:排序扫描线+cdq分治+树状数组 排序扫描线+二维数据结构 基本思想是一维扫描线顺序扫描维护差分,一维用数据结构维护区间(线段树维护区间,树状数组差分维护前缀和). [BZOJ3161]布娃娃(扫描线+线段树) BZOJ 4059 Cerc2012 Non-b

【BZOJ4059】[Cerc2012]Non-boring sequences 分治

[BZOJ4059][Cerc2012]Non-boring sequences Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列,请你判断它是不是不无聊的. Input 第一行一个正整数T,表示有T组数据.每组数据第一行一个正整数n,表示序列的长度,1 <= n <= 200000.接下来一行n个不超过10^9的非负整数,表示这个

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]检测即可. 为了保证复杂度,我

poj 1776 Task Sequences

http://poj.org/problem?id=1776 题意: 有一个机器要完成N个作业, 给你一个N*N的矩阵, M[i][j]=1,表示完成第i个作业后不用重启机器,继续去完成第j个作业 M[i][j]=0,表示如果做完第i个作业,想要继续去做第j个作业,那么必须重启机器 对于任意两个作业都有M[i][j] = 1或者M[j][i] = 1. 求出完成这N个作业启动机器的最少次数,以及每次启动完成作业的数量和这些作业的顺序 初始时机器处于关闭状态. 将M当做图,就是找最少的路径条数覆盖

Boring Class HDU - 5324 (CDQ分治)

Mr. Zstu and Mr. Hdu are taking a boring class , Mr. Zstu comes up with a problem to kill time, Mr. Hdu thinks it’s too easy, he solved it very quickly, what about you guys? Here is the problem: Give you two sequences L1,L2,...,Ln and R1,R2,...,Rn. Y