题解:

还是一道不错的题目

首先它要求每个区间都满足要求,所以我们很容易想到将它映射到二维平面上

然后我们算出每个数的前驱以及后继li,ri

那么第一维是li-i,第二维是i-ri的区间就是合法的,同理交换

这样就变成了矩形覆盖问题

然后因为是不能遍历所有点的所以二维差分是不行的

2种方法

1.线段树+扫描线,将矩形两条边变为一条插入一条删除 nlogn

2.二维线段树 nlog^2n

另外正解其实也是很好想的

我们注意到如果有一个元素在整个序列中只出现了一次,序列就被分割为两个了

所以我们只要从两边一起向中间寻找就可以了

为什么这个复杂度是对的?

因为它是启发式合并的逆过程,每次分裂的复杂度是较小的那个

*不太想写正解没什么意思。。

代码:

*把清空操作变成vector记录就能过了我懒得改了

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register int
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define mid ((h+t)/2)
#define me(x) memset(x,0,sizeof(x))
char ss[<<],*A=ss,*B=ss;
char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T> void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=c^;
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
const int N=3e5;
int n,m,pre[N],scc[N],data[N*],x[N];
map<int,int>pos;
bool v[N*];
struct re{
int a,b,c,d;
}a[N*];
bool cmp(re x,re y)
{
return (x.a<y.a||((x.a==y.a)&&x.d>y.d));
}
void updata(int x)
{
if (data[x]>||(v[x*]&&v[x*+])) v[x]=; else v[x]=;
}
void insert(int x,int h,int t,int h1,int t1,int pos)
{
if (h1<=h&&t<=t1)
{
data[x]+=pos;
updata(x); return;
}
if (h1<=mid) insert(x*,h,mid,h1,t1,pos);
if (t1>mid) insert(x*+,mid+,t,h1,t1,pos);
updata(x);
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
int T;
read(T);
rep(tt,,T)
{
read(n);
pos.clear();
me(pre); me(scc); me(data); me(v);
rep(i,,n)
{
read(x[i]);
pre[i]=pos[x[i]]+;
if (pos[x[i]]) scc[pos[x[i]]]=i-;
pos[x[i]]=i;
}
rep(i,,n)
{
if (!pre[i]) pre[i]=;
if (!scc[i]) scc[i]=n;
}
rep(i,,n)
{
a[i*-].a=pre[i]; a[i*-].b=i; a[i*-].c=scc[i]; a[i*-].d=;
a[i*-].a=i+; a[i*-].b=i; a[i*-].c=scc[i]; a[i*-].d=-;
a[i*-].a=i; a[i*-].b=pre[i]; a[i*-].c=i; a[i*-].d=;
a[i*].a=scc[i]+; a[i*].b=pre[i]; a[i*].c=i; a[i*].d=-;
}
int m=n;
n=*n;
sort(a+,a+n+,cmp);
bool t=;
// for (int i=1;i<=n;i++)
// cout<<a[i].a<<" "<<a[i].b<<" "<<a[i].c<<" "<<a[i].d<<endl;
rep(i,,n)
{
if (a[i].a>m) break;
insert(,,m,a[i].b,a[i].c,a[i].d);
if (a[i+].a!=a[i].a&&!v[])
{
t=; printf("boring\n");
break;
}
}
if (t) printf("non-boring\n");
}
return ;
}

bzoj4059的更多相关文章

  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】Non-boring sequences(分析时间复杂度)

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

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

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

  4. 【BZOJ4059】Non-boring sequences

    Solution 记序列为\(a\),计算出与\(a_i\)相等的前一个元素的位置\(pre_i\),以及后一个元素的位置\(nex_i\),显然,对于那些左端点处于\((pre_i,i]\)以及右端 ...

  5. bzoj4059 [Cerc2012]Non-boring sequences

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题解] 考虑分治.定义过程solve(l,r)为判断全在[l,r]范围内的所有连续子 ...

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

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

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

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

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

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

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

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

随机推荐

  1. TechnoSoftware OPCDA client(1.2.1) Error Codes

    OPCDA.NET Client Interface WrapperSummary of OPC Error Codes We have attempted to minimize the numbe ...

  2. MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)

    mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...

  3. C#如何使用SqlCacheDependency

    1.数据库依赖类SqlCacheDependency 数据库缓存依赖主要解决的是当数据库的内容发生改变时,如何及时通知缓存,并更新缓存中的数据的问题. 语法定义: SqlCacheDependency ...

  4. 打包APP

    记得之前网上也有app打包平台,但是都会有所限制,或者增加广告等等,这里呢,介绍一款工具,可以自己将网站打包成app. wex5 (WeX5开源免费跨端开发工具-html5 app开发就用WeX5)官 ...

  5. python 知识梳理

    1.数据类型:字符串,列表,元组,字典,集合.处理每种数据类型的函数 2.判断与循环部分 3.高级函数:lambda,map,reduce,filter 4.自定义模块以及第三方模块 5.函数式编程 ...

  6. RCNN--目标检测

    原博文:http://www.cnblogs.com/soulmate1023/p/5530600.html 文章简要介绍RCNN的框架,主要包含: 原图-->候选区域生成-->对每个候选 ...

  7. Confluence 6 如何备份和恢复

    如何备份 有关备份你数据库使用的命令与你使用的具体数据库有关,例如针对 PostgreSQL 数据库,备份命令为 pg_dump dbname > outfile. 你应该针对你使用的数据库不同 ...

  8. (七)STL适配器

    1.适配器是稍微修改某些功能,比如三个参数改为两个参数,函数的名称改一下等等,可以出现在容器.迭代器和仿函数中. 2.适配器相当于对某个东西进行封装,例如A是B的适配器,则真正的功能实现是在B中,可以 ...

  9. vue之自行实现派发与广播-dispatch与broadcast

    要解决的问题 主要针对组件之间的跨级通信 为什么要自己实现dispatch与broadcast? 因为在做独立组件开发或库时,最好是不依赖第三方库 为什么不使用provide与inject? 因为它的 ...

  10. python自动化-unittest批量执行用例(discover)

    前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了. 加载用例后,用unittest里面的Text ...