【BZOJ3489】A simple rmq problem(KD-Tree)

题面

BZOJ

题解

直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给每个数记录一下和它相等的上一个位置和下一个位置,那么这两个位置的限定范围就在区间以外,于是变成了一个\(4\)维数点问题,直接\(KD-Tree\)了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. #define inf 1000000000
  6. #define ls t[o].ch[0]
  7. #define rs t[o].ch[1]
  8. #define MAX 100100
  9. inline int read()
  10. {
  11. int x=0;bool t=false;char ch=getchar();
  12. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  13. if(ch=='-')t=true,ch=getchar();
  14. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  15. return t?-x:x;
  16. }
  17. int n,m,lt[MAX],b[MAX],rt,D;
  18. struct Node{int d[4];}a[MAX];
  19. struct KDNode{int mn[4],mx[4],ch[4];Node a;}t[MAX];
  20. bool operator<(Node a,Node b){return a.d[D]<b.d[D];}
  21. void cmin(int &x,int y){x=min(x,y);}
  22. void cmax(int &x,int y){x=max(x,y);}
  23. void pushup(int x,int y)
  24. {
  25. for(int i=0;i<4;++i)
  26. cmin(t[x].mn[i],t[y].mn[i]),cmax(t[x].mx[i],t[y].mx[i]);
  27. }
  28. int Build(int l,int r,int nd)
  29. {
  30. D=nd;int o=(l+r)>>1;nth_element(&a[l],&a[o],&a[r+1]);
  31. t[o].mn[0]=t[o].mx[0]=t[o].a.d[0]=a[o].d[0];
  32. t[o].mn[1]=t[o].mx[1]=t[o].a.d[1]=a[o].d[1];
  33. t[o].mn[2]=t[o].mx[2]=t[o].a.d[2]=a[o].d[2];
  34. t[o].mn[3]=t[o].mx[3]=t[o].a.d[3]=a[o].d[3];
  35. if(l<o)ls=Build(l,o-1,(nd+1)%4),pushup(o,ls);
  36. if(r>o)rs=Build(o+1,r,(nd+1)%4),pushup(o,rs);
  37. return o;
  38. }
  39. bool check(Node l,Node r,Node a)
  40. {
  41. for(int i=0;i<4;++i)
  42. if(!(l.d[i]<=a.d[i]&&a.d[i]<=r.d[i]))
  43. return false;
  44. return true;
  45. }
  46. int ans;
  47. Node L,R;
  48. void Query(int o)
  49. {
  50. for(int i=0;i<4;++i)if(t[o].mn[i]>R.d[i]||t[o].mx[i]<L.d[i])return;
  51. if(check(L,R,t[o].a))L.d[2]=max(L.d[2],t[o].a.d[2]);
  52. if(ls)Query(ls);if(rs)Query(rs);
  53. }
  54. int main()
  55. {
  56. n=read();m=read();
  57. for(int i=1;i<=n;++i)
  58. {
  59. b[i]=read();
  60. a[i]=(Node){{lt[b[i]],i,b[i],0}};
  61. lt[b[i]]=i;
  62. }
  63. for(int i=1;i<=n;++i)lt[i]=n+1;
  64. for(int i=n;i>=1;--i)
  65. {
  66. a[i].d[3]=lt[b[i]];
  67. lt[b[i]]=i;
  68. }
  69. rt=Build(1,n,0);
  70. while(m--)
  71. {
  72. int l=(read()+ans)%n+1,r=(read()+ans)%n+1;
  73. if(l>r)swap(l,r);
  74. L=(Node){0,l,0,r+1};
  75. R=(Node){l-1,r,inf,n+1};
  76. Query(rt);
  77. printf("%d\n",ans=L.d[2]);
  78. }
  79. return 0;
  80. }

【BZOJ3489】A simple rmq problem(KD-Tree)的更多相关文章

  1. 【BZOJ3489】A simple rmq problem kd-tree

    [BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...

  2. 【BZOJ3489】A simple rmq problem

    [BZOJ3489]A simple rmq problem 题面 bzoj 题解 这个题不强制在线的话随便做啊... 考虑强制在线时怎么搞 预处理出一个位置上一个出现的相同数的位置\(pre\)与下 ...

  3. 【bzoj3489】 A simple rmq problem

    http://www.lydsy.com/JudgeOnline/problem.php?id=3489 (题目链接) 题意 在线求区间不重复出现的最大的数. Solution KDtree竟然能够处 ...

  4. 【bzoj3489】 A simple rmq problem k-d树

    由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...

  5. 【bzoj3489】A simple rmq problem 三维KD-tree

    题目描述 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会 ...

  6. 【BZOJ3489】A simple rmq problem【kd树】

    题意 给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. 分析 预处理 ...

  7. 【BZOJ】【3489】A simple rmq problem

    KD-Tree(乱搞) Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]) ...

  8. bzoj3489: A simple rmq problem (主席树)

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  9. 【HDOJ5974】A Simple Math Problem(构造,解方程)

    题意:给定A与B,要求构造出一组X,Y,使得X+Y=A,lcm(X,Y)=B A<=2e4,B<=1e9 思路:A的范围较小,考虑以A为突破口 枚举A的约数k,复杂度O(sqrt(A)) ...

随机推荐

  1. 利用fiddler core api 拦截修改 websocket 数据

    一般的中间人攻击基本都是拦截修改普通的http协议里面的内容,而对于怎么拦截修改websocket协议传输的内容好像都没有多少介绍. talk is cheap show me the code us ...

  2. Window下mysql环境配置问题整理

    Window下mysql环境配置问题整理 参考如下链接. 无需安装解压版mysql包 创建选项配置 首次启动服务 用mysqld初始化目录 安装后设置和测试 启动服务错误信息 管理员模式打开cmd m ...

  3. H5——video百花齐放(浏览器自带的播放器)

    前言 手机自带浏览器的H5播放器 真是百花齐放啊(各个手机厂家有各个厂家的控件UI) 需求 手机浏览器木有控件条 自动播放 全屏处理 监控进度条 快进后退 自动播放 自动播放就给跪了 ios 安卓 为 ...

  4. iOSApp上下有黑边

    如图: 这种情况就是没有启动页导致的,加了启动页图片之后就不会再出现了. 设置启动页的方法: http://www.cnblogs.com/BK-12345/p/5218229.html 有的人说我加 ...

  5. docker之镜像管理命令

    一.docker image 镜像管理命令 指令 描述ls 列出本机镜像build 构建镜像来自Dockerfilehistory 查看镜像历史inspect 显示一个或多个镜像详细信息pull 从镜 ...

  6. 【LeetCode】数组--合并区间(56)

    写在前面   老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...

  7. Google I/O 2018大会小结

    Google I/O 2018大会于北京时间5月9日凌晨1点,在美国山景城Shoreline Amphitheatre(圆形剧场)举办.看了一下录播,字幕延迟,全程靠听,下面对上午的主会进行一个小结. ...

  8. 第十七次ScrumMeeting博客

    第十七次ScrumMeeting博客 本次会议于12月7日(四)22时整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的内容和 ...

  9. Beta版项目总结

    1.设想与目标 我们的产品名是理财猫,为了解决当今大学生花钱不知道节制以及不知道花的钱都去哪了的痛苦,提醒他们该记录这一天的消费情况,我们有独特的办法那就是将记账软件和闹钟结合起来,每天定时的提醒用户 ...

  10. 软工实践练习一 git使用心得

    使用git进行代码管理的心得 小组 1.结对的同学创建了小组,我属于被邀请的.附上图片一张. 2.已将代码库https://github.com/sefzu2015/AutoCS fork到了小组or ...