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是指一棵有根二叉树,每个点包含一个正整数权值,且 ...
随机推荐
- planning深度剖析
planning深度剖析 结合find命令过滤目录及文件名后缀: find /home/hadoop/nisj/automationDemand/ -type f -name '*.py'|xargs ...
- vue2.x + vux采坑总结(一)
1.<tab-bar> 切换时,iocn高亮跟着切换问题 vux的Tabbar组件是用来实现底部tab栏,详情见官网文档 , 实现实例截图: 代码如下,控制高亮的是代码凸显部分:selec ...
- python操作三大主流数据库(5)python操作mysql⑤使用Jinja2模板提取优化页面展示
python操作mysql⑤使用Jinja2模板提取优化页面展示 在templates目录下的index.html.cat.html等页面有一些共同的元素,代码比较冗余可以使用模板提取公共代码,在各网 ...
- https 对 json空对象解析的影响
2017年11月24日09:56:01 记录一个问题: PHP返回json给APP(安卓, fastjson) 其中一个值是空对象 json_encode( [ 'aaa' => new st ...
- ASP.NET MVC5高级编程 之 路由
每个ASP.NET MVC应用程序都需要路由来定义自己处理请求的方式.路由是MVC应用程序的入口点.路由的核心工作是将一个请求映射到一个操作 路由主要有两种用途: 匹配传入的请求(该请求不匹配服务器文 ...
- [C]gcc编译器的一些常用语法
简单的GCC语法: 如果你只有一个文件(或者只有几个文件),那么就可以不写Makefile文件(当然有Makefile更加方便),用gcc直接编译就行了.在这里我们只介绍几个我经常用的几个参数,第一是 ...
- [C][代码实例]冒泡排序
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- [MySql]索引的一些技巧
一.多表子从查询 多表查询时,子查询可能会出现触发不了索引的情况 ,)); 上面语句,test_1和test_public都WHERE了主键id,常理来说这个查询不存在问题,事实上主语句并不会触发索引 ...
- 基于C#net4.5websocket客户端与服务端
只支持win8以上系统以及windows server2012以上系统 最近在研究视频传输给浏览器,然后使用H5标签解码.视频流采用websocket传输.所以研究了一下C#的websocket. 首 ...
- STL 容器区别:vector、list、deque、set、map的底层实现
https://blog.csdn.net/shawjan/article/details/45424405