这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线。但不幸的是,扫描线常数过大,无法通过本题。

考虑分治。对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出现的位置,每当遇到一个出现次数=1的数,可以直接把区间分为两半判断,反之则丢掉这个数,而仅会分治一次,且掐断地方是先判两边,复杂度近似O(nlogn)。

实在太坑了,其实是一道练习扫描线的好题qwq

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define lson l,mid,rt<<1
  4. #define rson mid+1,r,rt<<1|1
  5. using namespace std;
  6. const int N=2e5+;
  7. typedef long long ll;
  8. struct line{int x,l,r,v;}c[N<<];
  9. int n,m,a[N],b[N],L[N],R[N],pre[N],sum[N<<],cnt[N<<];
  10. bool cmp(line a,line b){return a.x<b.x;}
  11. void insert(int a1,int a2,int b1,int b2)
  12. {c[++m]=(line){a1,b1,b2,},c[++m]=(line){a2+,b1,b2,-};}
  13. void build(int l,int r,int rt)
  14. {
  15. sum[rt]=cnt[rt]=;
  16. if(l==r)return;
  17. int mid=l+r>>;
  18. build(lson),build(rson);
  19. }
  20. void pushup(int l,int r,int rt)
  21. {
  22. if(cnt[rt])sum[rt]=r-l+;
  23. else if(l==r)sum[rt]=;
  24. else sum[rt]=sum[rt<<]+sum[rt<<|];
  25. }
  26. void update(int L,int R,int v,int l,int r,int rt)
  27. {
  28. if(L<=l&&r<=R){cnt[rt]+=v,pushup(l,r,rt);return;}
  29. int mid=l+r>>;
  30. if(L<=mid)update(L,R,v,lson);
  31. if(R>mid)update(L,R,v,rson);
  32. pushup(l,r,rt);
  33. }
  34. int main()
  35. {
  36. int T;scanf("%d",&T);
  37. while(T--)
  38. {
  39. scanf("%d",&n);
  40. build(,n,);
  41. for(int i=;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
  42. sort(b+,b+n+);
  43. m=unique(b+,b+n+)-b-;
  44. for(int i=;i<=n;i++)a[i]=lower_bound(b+,b+m+,a[i])-b;
  45. m=;
  46. for(int i=;i<=n;i++)pre[i]=;
  47. for(int i=;i<=n;i++)L[i]=pre[a[i]],pre[a[i]]=i;
  48. for(int i=;i<=n;i++)pre[i]=n+;
  49. for(int i=n;i;i--)R[i]=pre[a[i]],pre[a[i]]=i;
  50. for(int i=;i<=n;i++)insert(L[i]+,i,i,R[i]-);
  51. sort(c+,c+m+,cmp);
  52. ll ans=;
  53. for(int i=,p=;i<=n;i++)
  54. {
  55. while(p<m&&c[p+].x==i)p++,update(c[p].l,c[p].r,c[p].v,,n,);
  56. ans+=sum[];
  57. }
  58. if(ans==1ll*n*(n+)/)puts("non-boring");
  59. else puts("boring");
  60. }
  61. }

扫描线的TLE代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<map>
  4. using namespace std;
  5. const int N=2e5+;
  6. int n,m,a[N],pre[N],nxt[N];
  7. map<int,int>lst;
  8. bool solve(int l,int r)
  9. {
  10. if(l>=r)return ;
  11. int p=l,q=r;
  12. while(p<=q)
  13. {
  14. if(pre[p]<l&&nxt[p]>r)return solve(l,p-)&&solve(p+,r);p++;
  15. if(pre[q]<l&&nxt[q]>r)return solve(l,q-)&&solve(q+,r);q--;
  16. }
  17. return ;
  18. }
  19. int main()
  20. {
  21. int T;scanf("%d",&T);
  22. while(T--)
  23. {
  24. lst.clear();
  25. scanf("%d",&n);
  26. for(int i=,pos;i<=n;i++)scanf("%d",&a[i]),pos=lst[a[i]],nxt[pos]=i,pre[i]=pos,lst[a[i]]=i;
  27. for(int i=;i<=n;i++)nxt[lst[a[i]]]=n+;
  28. if(solve(,n))puts("non-boring");else puts("boring");
  29. }
  30. }

分治的AC代码

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

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

  4. BZOJ 4059: [Cerc2012]Non-boring sequences(启发式分治)

    传送门 解题思路 首先可以想到要预处理一个\(nxt_i\)和\(pre_i\),表示前后与当前位置权值相同的节点,那么这样可以迅速算出某个点在某段区间是否出现多次.然后这样的话就考虑分治,对于\([ ...

  5. UVA1608-Non-boring sequences(分治)

    Problem UVA1608-Non-boring sequences Accept: 227  Submit: 2541Time Limit: 3000 mSec Problem Descript ...

  6. Non-boring sequences(启发式分治)

    题意:一个序列被称作是不无聊的,当且仅当,任意一个连续子区间,存在一个数字只出现了一次,问给定序列是否是不无聊的. 思路:每次找到一个只出现了一次的点,其位置的pos,那么继续分治[L,pos-1], ...

  7. UVA - 1608 Non-boring sequences (分治)

    题意:如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列式为non-boring.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是否无聊. ...

  8. HDU 5324 Boring Class CDQ分治

    题目传送门 题目要求一个3维偏序点的最长子序列,并且字典序最小. 题解: 这种题目出现的次数特别多了.如果不需要保证字典序的话直接cdq就好了. 这里需要维护字典序的话,我们从后往前配对就好了,因为越 ...

  9. 【刷题】BZOJ 4059 [Cerc2012]Non-boring sequences

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

随机推荐

  1. C# 使用复选框实现循环添加多条信息入库!

    先在前台获取到所有要添加信息的Id $('.imgid').each(function () {                     if ($(this).attr("src" ...

  2. 关于博主 5ab

    博主是 5ab,一个 ZJ 初一大蒟蒻. 以 5ab 及类似名号在各大 OJ 出没. 欢迎来到 5ab 这个超级大蒟蒻的博客!!! My luogu blog 关于 5ab 的码风 大括号换行!!! ...

  3. text字体样式(多行结尾省略,彩色渐变字体)

    text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; ...

  4. ntp时间同步服务器

    [root@localhost ~]# ntpdate time.nist.gov 虚拟机时间不对   自动同步   sudo ntpdate asia.pool.ntp.org 要是同步后时间还是不 ...

  5. Mybatis(1)-初识mybaits

    一.概述 1.概述 mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身, 而不需要花费精力去处理加载驱动.创建连接.创建 state ...

  6. vmware桥接模式-无法内网通-克隆机要删除的文件-ssl

    网卡太多自动模式有时候无法正常通信需要绑定外部网卡 rm /etc/udev/rules.d/-persistent-ipoib.rules vmware报错 Microsoft Runtime DL ...

  7. C#构造函数调用其他构造函数

    http://blog.csdn.net/dogfish/article/details/6990266  <-- 虏来的地 public class Class1 { public Class ...

  8. Spring Boot作为Spring Cloud基础设施

    spring cloud包含的核心特性: Distributed/versioned configuration(分布式配置) Service registration and discovery(服 ...

  9. Ubuntu下caffe:用自己的图片训练并测试AlexNet模型

    参考博客:https://blog.csdn.net/eereere/article/details/79118645#commentBox 目录 1.准备图片 2. 将 图片路径写入txt 参考 这 ...

  10. Git--git log

    参考 https://www.cnblogs.com/bellkosmos/p/5923439.html https://www.cnblogs.com/mkl34367803/p/9219913.h ...