bzoj4059
题解:
还是一道不错的题目
首先它要求每个区间都满足要求,所以我们很容易想到将它映射到二维平面上
然后我们算出每个数的前驱以及后继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的更多相关文章
- 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 ...
- 【BZOJ4059】Non-boring sequences(分析时间复杂度)
题目: BZOJ4059 分析: 想了半天没什么想法,百度到一个神仙做法-- 设原数列为 \(a\),对于每一个 \(i\) 求出前一个和后一个和 \(a_i\) 相等的位置 \(pre[i]\) 和 ...
- 【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)
4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 440 Solved: 16 ...
- 【BZOJ4059】Non-boring sequences
Solution 记序列为\(a\),计算出与\(a_i\)相等的前一个元素的位置\(pre_i\),以及后一个元素的位置\(nex_i\),显然,对于那些左端点处于\((pre_i,i]\)以及右端 ...
- bzoj4059 [Cerc2012]Non-boring sequences
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题解] 考虑分治.定义过程solve(l,r)为判断全在[l,r]范围内的所有连续子 ...
- 【bzoj4059】[Cerc2012]Non-boring sequences 分治
题目描述 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定一个整数序列, ...
- 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences
这个做法名字是从武爷爷那里看到的…… Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子 ...
- BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)
这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...
- 【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree
和bzoj4059: [Cerc2012]Non-boring sequences非常相似 Description 一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且 ...
随机推荐
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合. 看代码: 7.1.解释 main(),女 ...
- js模板引擎-art-template常用总结(转)
原文:https://www.cnblogs.com/shiyou00/p/6841801.html art-template javascript 模板引擎,官网:https://github.co ...
- 初探Linux内核中的内存管理
Linux内核设计与实现之内存管理的读书笔记 初探Linux内核管理 内核本身不像用户空间那样奢侈的使用内存; 内核不支持简单快捷的内存分配机制, 用户空间支持? 这种简单快捷的内存分配机制是什么呢? ...
- ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
背景 老生常谈,为sql当时着迷了,啥都用sql解决.看这个语句,麻烦的. ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row ...
- Debian下undefined reference to ‘pthread_create’问题解决
今天在写线程测试程序(pthread_create)时出现如下问题, 明明在头文件中包含了<pthread.h>,但是仍然提示找不到函数 pthread_create 和 pthread_ ...
- 深入Golang调度器之GMP模型
前言 随着服务器硬件迭代升级,配置也越来越高.为充分利用服务器资源,并发编程也变的越来越重要.在开始之前,需要了解一下并发(concurrency)和并行(parallesim)的区别. 并发: 逻 ...
- CentOS 7 服务器之间ssh无密码登录、传输文件
在Linux服务器之间使用ssh命令向另一个Linux服务器发送执行指令是需要输入密码 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一 ...
- Java二叉树的实现与特点
二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树: ...
- Confluence 6 数据模型
本文档提供了 Confluence 的数据结构视图(schema )和数据模型概念上的的概述. 备注: Hibernate 的映射文件是针对 Confluence 数据模型的直接描述.在系统中的 Co ...
- bat如何实现图片与名字匹配重命名
背景:有一批图片按顺序截取,需要按照规定的名称进行重名命. 问题:用批处理怎么实现呢?(公司电脑手动重名时,卡的不要不要的) No1:解决:将规定的名称放入criterion.txt中,将批处理Ren ...