4059: [Cerc2012]Non-boring sequences

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 440  Solved: 160
[Submit][Status][Discuss]

Description

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

Input

第一行一个正整数T,表示有T组数据。每组数据第一行一个正整数n,表示序列的长度,1 <= n <= 200000。接下来一行n个不超过10^9的非负整数,表示这个序列。

Output

对于每组数据输出一行,输出"non-boring"表示这个序列不无聊,输出"boring"表示这个序列无聊。

Sample Input

4
5
1 2 3 4 5
5
1 1 1 1 1
5
1 2 3 2 1
5
1 1 2 1 1

Sample Output

non-boring
boring
non-boring
boring

HINT

Source

鸣谢Tjz

Solution

不想多说什么

首先预处理出每个数字,上一次出现的位置$pre[i]$,下一次出现的位置$suf[i]$,显然,对于区间是满足独一无二的,当左端点在$[pre[i]+1,i]$右端点在$[i,suf[i]-1]$

然后我们把它们放到平面上,<l,r>表示一个点,那么满足的情况,显然是一个矩形

那么我们把这些所有的矩形都建出来,然后扫描线。

如果这些矩形的并覆盖所有合法点,那么就是non-boring,否则是boring

问题在于,这不是正解!!!!正解是神奇的爆搜,转别人的博客  :  传送门

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. inline int read()
  8. {
  9. int x=,f=; char ch=getchar();
  10. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  11. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
  12. return x*f;
  13. }
  14. #define MAXN 200010
  15. int T,N,A[MAXN];
  16. struct SegmentTreeNode{int minn,tag,l,r;}tree[MAXN<<];
  17. inline void Update(int now) {tree[now].minn=min(tree[now<<].minn,tree[now<<|].minn);}
  18. inline void PushDown(int now)
  19. {
  20. if (!tree[now].tag || tree[now].l==tree[now].r) return;
  21. int tag=tree[now].tag; tree[now].tag=;
  22. tree[now<<].minn+=tag; tree[now<<].tag+=tag;
  23. tree[now<<|].minn+=tag; tree[now<<|].tag+=tag;
  24. }
  25. void BuildTree(int now,int l,int r)
  26. {
  27. tree[now].l=l; tree[now].r=r; tree[now].minn=; tree[now].tag=;
  28. if (l==r) return;
  29. int mid=(l+r)>>;
  30. BuildTree(now<<,l,mid);
  31. BuildTree(now<<|,mid+,r);
  32. Update(now);
  33. }
  34. void Change(int now,int L,int R,int D)
  35. {
  36. PushDown(now);
  37. int l=tree[now].l,r=tree[now].r;
  38. if (L<=l && R>=r) {tree[now].tag+=D; tree[now].minn+=D; return;}
  39. int mid=(l+r)>>;
  40. if (L<=mid) Change(now<<,L,R,D);
  41. if (R>mid) Change(now<<|,L,R,D);
  42. Update(now);
  43. }
  44. int Query(int now,int L,int R)
  45. {
  46. PushDown(now);
  47. int l=tree[now].l,r=tree[now].r;
  48. if (L<=l && R>=r) return tree[now].minn;
  49. int mid=(l+r)>>,re=0x7fffffff;
  50. if (L<=mid) re=min(re,Query(now<<,L,R));
  51. if (R>mid) re=min(re,Query(now<<|,L,R));
  52. return re;
  53. }
  54. struct LineNode
  55. {
  56. int x,y1,y2,f;//y1>y2
  57. LineNode (int x=,int y1=,int y2=,int f=)
  58. : x(x),y1(y1),y2(y2),f(f) {}
  59. bool operator < (const LineNode & A) const
  60. {return x==A.x? y1<A.y1 : x<A.x;}
  61. }Line[MAXN<<];
  62. int ls[MAXN<<],tp,pre[MAXN],suf[MAXN],last[MAXN];
  63. int main()
  64. {
  65. T=read();
  66. while (T--)
  67. {
  68. N=read();
  69. tp=;
  70. for (int i=; i<=N; i++) ls[++tp]=A[i]=read();
  71. sort(ls+,ls+tp+);
  72. tp=unique(ls+,ls+tp+)-ls-;
  73. for (int i=; i<=N; i++) A[i]=lower_bound(ls+,ls+tp+,A[i])-ls;
  74. for (int i=; i<=N; i++) pre[i]=suf[i]=last[i]=;
  75. for (int i=; i<=N; i++)
  76. {
  77. if (!last[A[i]]) pre[i]=;
  78. else suf[last[A[i]]]=i-,pre[i]=last[A[i]]+;
  79. last[A[i]]=i;
  80. }
  81. for (int i=; i<=N; i++) if (!suf[i]) suf[i]=N;
  82. // for (int i=1; i<=N; i++) printf("%d %d %d \n",i,pre[i],suf[i]);
  83. tp=;
  84. for (int i=; i<=N; i++)
  85. {
  86. Line[++tp]=LineNode(pre[i],suf[i],i,);
  87. Line[++tp]=LineNode(i+,suf[i],i,-);
  88. }
  89. sort(Line+,Line+tp+);
  90. // for (int i=1; i<=tp; i++)
  91. // printf("%d %d %d %d\n",Line[i].x,Line[i].y2,Line[i].y1,Line[i].f);
  92. BuildTree(,,N);
  93. bool flag=;
  94. for (int X=,i=; X<=N; X++)
  95. {
  96. while (i<=tp && Line[i].x==X)
  97. Change(,Line[i].y2,Line[i].y1,Line[i].f),i++;
  98. if (Query(,X,N)==) {flag=; break;}
  99. }
  100. if (flag) puts("boring"); else puts("non-boring");
  101. }
  102. return ;
  103. }

【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)的更多相关文章

  1. BZOJ 1818 线段树+扫描线

    思路: 可以把题目转化成 给你一些沿坐标轴方向的线段 让你求交点个数 然后就线段树+扫描线 搞一搞 (线段不包含断点 最后+n 这种方式 比线段包含断点+各种特判要好写得多) //By SiriusR ...

  2. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  3. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  4. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  5. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  6. BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤

    3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...

  7. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  8. hdu 5091(线段树+扫描线)

    上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...

  9. POJ1151+线段树+扫描线

    /* 线段树+扫描线+离散化 求多个矩形的面积 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...

随机推荐

  1. three.js 之旅 (三)

    复制自:http://www.cnblogs.com/ssrsblogs/p/5611332.html 创建模型: 1.长方体: THREE.CubeGeometry(width, height, d ...

  2. Ant 命令行编译Android项目

    首先把android sdk下的tools目录加到系统path环境变量里, 要么就得直接指定android.bat的绝对路径 对于一个新项目, 可以用这个命令创建需要的ant编译环境(可以看到andr ...

  3. switch2osm使用open street map离线地图中文乱码方框解决办法

    ----------written by shenwenkai------------- ubuntu linux环境下,按照网址(https://switch2osm.org/serving-til ...

  4. [Azure] 使用 Visual Studio 2013 管理中国版 Azure 订阅

    比较关心微软平台技术的朋友应该都知道,微软云服务(Microsoft Azure)以下简称Azure分为全球版和中国版,由于政府法规问题中国版的服务是由二十一世纪互联运营,整体来看中国版Azure和全 ...

  5. SQL2012删除作业失败的处理

    修改msdb数据库中的过程sp_delete_job,如下: USE [msdb] GO /****** Object: StoredProcedure [dbo].[sp_delete_job] S ...

  6. gRpc NET Core

    NET Core下使用gRpc公开服务(SSL/TLS) 一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多 ...

  7. mybatis的物理分页:mybatis-paginator

    github上有一个专门针对mybatis的物理分页开源项目:mybatis-paginator,兼容目前绝大多数主流数据库,十分好用,下面是使用步骤: 环境:struts2 + spring + m ...

  8. Block Chain, a protocol view

    我做了个区块链的文档,给自己扫盲用的,有兴趣的可以看下,主要是自己画示意图比较好理解,示意图之后的专题部分,内容直接取自参考链接.网上的资料都是谈区块链有什么性质.有什么能力.有什么应用之类的,我主要 ...

  9. Python __init__.py 作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加 ...

  10. IE6下margin时,float浮动产生双倍边距

    今天遇到了一个IE6下的兼容性问题,虽然IE6已经不被大众所期待了,用户也已基本上消失的所剩无几,但是,作为一个问题而存在,我们有必要尝试的去研究一下bug的改善方法 对元素float-left,然后 ...