传送门: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]检测即可。

为了保证复杂度,我们要从两边同时往中间搜,这样复杂度为

T(n) = max{T(n-k) + T(k) + O(min(k, n-k))} = O(nlogn)

或者用“启发式合并”的逆过程也能证明。

# include <stdio.h>
# include <algorithm>
# include <vector>
// # include <bits/stdc++.h> using namespace std; int T, n, a[], pre[], nxt[];
int lst[], na[];
vector<int> vec;
vector<int>::iterator it; inline bool judge(int l, int r) {
if (l == r) return ;
if (l == r-) return a[l] != a[r];
for (int i=l, j=r; i<=j; ++i, --j) {
if(pre[i] < l && nxt[i] > r) {
if(i != l) return judge(l, i-) && judge(i+, r);
else return judge(i+, r);
}
if(pre[j] < l && nxt[j] > r) {
if(j != r) return judge(l, j-) && judge(j+, r);
else return judge(l, j-);
}
}
return ;
} inline void out(int *ot, int ed) {
for (int i=; i<=ed; ++i) printf("%d ", ot[i]);
puts("");
} int main() {
scanf("%d", &T);
while(T--) {
vec.clear();
scanf("%d", &n);
for (int i=; i<=n; ++i) {
scanf("%d", &a[i]);
pre[i] = , nxt[i] = n+;
vec.push_back(a[i]);
}
sort(vec.begin(), vec.end());
it = unique(vec.begin(), vec.end());
vec.erase(it, vec.end());
for (int i=; i<=n; ++i)
na[i] = lower_bound(vec.begin(), vec.end(), a[i]) - vec.begin() + ; for (int i=; i<=n; ++i) lst[i] = ;
for (int i=; i<=n; ++i) {
if(lst[na[i]] != ) pre[i]=lst[na[i]];
lst[na[i]]=i;
} for (int i=; i<=n; ++i) lst[i] = n+;
for (int i=n; i>=; --i) {
if(lst[na[i]] != n+) nxt[i]=lst[na[i]];
lst[na[i]]=i;
} //out(pre, n);
//out(nxt, n); if(judge(, n)) puts("non-boring");
else puts("boring");
} return ;
}

bzoj4059 [Cerc2012]Non-boring sequences的更多相关文章

  1. bzoj4059 [Cerc2012]Non-boring sequences && bzoj5200 [NWERC2017]Factor-Free Tree

    https://konnyakuxzy.github.io/BZPRO/JudgeOnline/4059.html https://cn.vjudge.net/problem/Gym-100624D ...

  2. 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences

    这个做法名字是从武爷爷那里看到的…… Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子 ...

  3. BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)

    这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...

  4. 【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree

    和bzoj4059: [Cerc2012]Non-boring sequences非常相似 Description 一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且 ...

  5. 【bzoj4059】[Cerc2012]Non-boring sequences 分治

    题目描述 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列, ...

  6. 【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)

    4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 16 ...

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

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

  8. 【BZOJ4059】Non-boring sequences(分析时间复杂度)

    题目: BZOJ4059 分析: 想了半天没什么想法,百度到一个神仙做法-- 设原数列为 \(a\),对于每一个 \(i\) 求出前一个和后一个和 \(a_i\) 相等的位置 \(pre[i]\) 和 ...

  9. [Cerc2012]Non-boring sequences

    Description 定义一个序列是不无聊的,当且仅当它的所有子区间都存在一个独一无二的数字,即每个子区间里至少存在一个数字只出现过一次.给定一个长度为\(N(N\leq2\times 10^5)\ ...

随机推荐

  1. POJ:2385-Apple Catching(dp经典题)

    Apple Catching Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14311 Accepted: 7000 Descr ...

  2. android gesture检测

    1.关于on<TouchEvent>的返回值 a return value of true from the individual on<TouchEvent> methods ...

  3. javascript类式继承模式#3——借用和设置原型

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. PJSIP-PJLIB(samples) (the usage of the pjlib lib) (eg:string/I/O)

    Here are some samples about  PJLIB! PJLIB is the basic lib of PJSIP, so we need master the lib first ...

  5. @property后面可以有哪些修饰符?

    原子性---nonatomic特质 如果不写默认情况为atomic(系统会自动加上同步锁,影响性能) 在iOS开发中尽量指定为nonatomic,这样有助于提高程序的性能 读/写权限---readwr ...

  6. wget下载https文件,服务器可以虚拟机中不行的问题

    用wget下载一个图片资源(https协议),在服务器上可以,但在本机的虚拟机中卡在下面这里了: [root@localhost ~]# wget 'https://gp1.wac.edgecastc ...

  7. leetcode 【 Remove Duplicates from Sorted List 】 python 实现

    题目: Given a sorted linked list, delete all duplicates such that each element appear only once. For e ...

  8. selenium fluentwait java实例

    本文转自:http://www.programcreek.com/java-api-examples/index.php?api=org.openqa.selenium.support.ui.Flue ...

  9. Java基础-4变量与数据类型

    变量:变量是Java程序中的一个基本存储单元.变量是一个标识符.类型及一个可选初始值的组合定义.所有的变量都有一个作用域,即变量在某一区域有效. 基本的变量声明方式如下: int a; float b ...

  10. ironic的自动化脚本

    # -*- coding:utf-8 -*- import json import subprocess import os import time import random trunk_start ...