Code:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <string>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. void setIO(string a)
  9. {
  10. string in=a+".in",out=a+".out";
  11. freopen(in.c_str(),"r",stdin);
  12. //freopen(out.c_str(),"w",stdout);
  13. }
  14.  
  15. #define maxn 210000
  16. int arr[maxn],A[maxn],root[maxn],n;
  17. vector<int>position[maxn];
  18. struct Segment_Tree
  19. {
  20. #define max_Tree 21000*100
  21. int lson[max_Tree],rson[max_Tree],cnt;
  22. int sumv[max_Tree],lmax[max_Tree],rmax[max_Tree];
  23. void pushup(int o)
  24. {
  25. sumv[o]=sumv[lson[o]]+sumv[rson[o]];
  26. lmax[o]=max(lmax[lson[o]],sumv[lson[o]]+lmax[rson[o]]);
  27. rmax[o]=max(rmax[rson[o]],sumv[rson[o]]+rmax[lson[o]]);
  28. }
  29. void build(int l,int r,int &o)
  30. {
  31. if(l>r)return;
  32. o=++cnt;
  33. if(l==r)
  34. {
  35. sumv[o]=lmax[o]=rmax[o]=1;
  36. return;
  37. }
  38. int mid=(l+r)>>1;
  39. build(l,mid,lson[o]);
  40. build(mid+1,r,rson[o]);
  41. pushup(o);
  42. }
  43. int update(int l,int r,int o,int pos) //modify val[pos] from 1 to -1
  44. {
  45. int oo=++cnt;
  46. int mid=(l+r)>>1;
  47. sumv[oo]=sumv[o];
  48. lson[oo]=lson[o];
  49. rson[oo]=rson[o];
  50. if(l==r)
  51. {
  52. sumv[oo]=-1;
  53. lmax[oo]=rmax[oo]=0;
  54. return oo;
  55. }
  56. if(pos<=mid) lson[oo]=update(l,mid,lson[o],pos);
  57. else rson[oo]=update(mid+1,r,rson[o],pos);
  58. pushup(oo);
  59. return oo;
  60. }
  61. int query_sum(int l,int r,int o,int L,int R)
  62. {
  63. if(l>r||r<L||l>R)return 0;
  64. if(l>=L&&r<=R) return sumv[o];
  65. int mid=(l+r)>>1;
  66. return query_sum(l,mid,lson[o],L,R)+query_sum(mid+1,r,rson[o],L,R);
  67. }
  68. int query_left(int l,int r,int o,int L,int R)
  69. {
  70. if(l>r||r<L||l>R)return 0;
  71. if(l>=L&&r<=R) return lmax[o];
  72. int mid=(l+r)>>1;
  73. return max(query_left(l,mid,lson[o],L,R),query_sum(l,mid,lson[o],L,R)+query_left(mid+1,r,rson[o],L,R));
  74. }
  75. int query_right(int l,int r,int o,int L,int R)
  76. {
  77. if(l>r||r<L||l>R)return 0;
  78. if(l>=L&&r<=R) return rmax[o];
  79. int mid=(l+r)>>1;
  80. return max(query_right(mid+1,r,rson[o],L,R),query_sum(mid+1,r,rson[o],L,R)+query_right(l,mid,lson[o],L,R));
  81. }
  82. bool check(int a,int b,int c,int d,int tps)
  83. {
  84. int sum1=query_sum(1,n,root[tps],b,c);
  85. int sum2=query_right(1,n,root[tps],a,b-1);
  86. int sum3=query_left(1,n,root[tps],c+1,d);
  87. if(sum1+sum2+sum3>=0)
  88. return true;
  89. return false;
  90. }
  91. }tree;
  92. int main()
  93. {
  94. //setIO("input");
  95. scanf("%d",&n);
  96. for(int i=1;i<=n;++i) scanf("%d",&arr[i]);
  97. for(int i=1;i<=n;++i) A[i]=arr[i];
  98. sort(A+1,A+1+n);
  99. for(int i=1;i<=n;++i) arr[i]=lower_bound(A+1,A+1+n,arr[i])-A; //离散编号
  100. for(int i=1;i<=n;++i) position[arr[i]].push_back(i);
  101. sort(arr+1,arr+1+n);
  102.  
  103. int pre=arr[1];
  104. tree.build(1,n,root[pre]);
  105.  
  106. for(int i=2;i<=arr[n];++i)
  107. {
  108. int a=root[i-1];
  109. for(int v=0;v<position[i-1].size();++v) a=tree.update(1,n,a,position[i-1][v]);
  110. root[i]=a;
  111. }
  112.  
  113. int q,a,b,c,d,lastans=0,que[10];
  114. scanf("%d",&q);
  115. while(q--)
  116. {
  117. for(int i=1;i<=4;++i) scanf("%d",&que[i]),que[i]=(que[i]+lastans)%n+1;
  118. sort(que+1,que+1+4);
  119. a=que[1],b=que[2],c=que[3],d=que[4];
  120.  
  121. int l=1,r=n,mid,ans=1;
  122. while(l<=r)
  123. {
  124. mid=(l+r)>>1;
  125. if(tree.check(a,b,c,d,mid)) l=mid+1,ans=mid;
  126. else r=mid-1;
  127. }
  128. lastans=A[ans];
  129. printf("%d\n",lastans);
  130. }
  131. return 0;
  132. }

  

洛谷P2839 [国家集训队]middle 主席树_二分的更多相关文章

  1. [洛谷P2839][国家集训队]middle

    题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...

  2. [洛谷2839/国家集训队]middle

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之 ...

  3. 2018.06.29 洛谷P1505 [国家集训队]旅游(树链剖分)

    旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有 ...

  4. 洛谷P1505 [国家集训队]旅游(树剖+线段树)

    传送门 这该死的码农题…… 把每一条边变为它连接的两个点中深度较浅的那一个,然后就是一堆单点修改/路径查询,不讲了 这里就讲一下怎么搞路径取反,只要打一个标记就好了,然后把区间和取反,最大最小值交换然 ...

  5. P2839 [国家集训队]middle

    P2839 [国家集训队]middle 好妙的题啊,,,, 首先二分一个答案k,把数列里>=k的数置为1,=0就是k>=中位数,<0就是k<中位数 数列的最大和很好求哇 左边的 ...

  6. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  7. 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量

    P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  8. 洛谷 P1505 [国家集训队]旅游 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐 ...

  9. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

随机推荐

  1. C#~异步编程再续~你必须要知道的ThreadPool里的throw

    问题依旧存在 之前写过相关文章异步编程的文章,本文主要还是一点补充,之前在IIS经常发w3wp进程无做挂了的情况,但一直没能找到真正的原因,而查找相关资料,找了一些相关的文章,如await和async ...

  2. Windows窗体应用布局详解

    上回我们已经会用基本的控件创建Windows窗体应用,这才我们再来认识一些高级控件并使用ADO.NET技术连接数据库来创建功能更坚强大的窗体应用! 菜单栏控件MenuStrip .NET中提供了一个M ...

  3. 亿财道APP赚钱攻略,亿财道,一个看广告年入36万的APP

            亿财道(http://etway.net/),一款看广告(传单)赚钱的软件,这是一项革新的广告产品,代替了以往的纸质传单.在商家节约成本的同时,还给阅读者佣金,推广也有相应提成比例. ...

  4. (转载)android 一些工具类汇总

    android 一些工具类汇总 作者:曾田生z 字体:[增加 减小] 类型:转载 时间:2016-08-14我要评论 本文给大家汇总介绍了一些常用的Android工具类,非常的简单实用,有需要的小伙伴 ...

  5. Tomcat学习(一)——使用Eclipse绑定Tomcat并发布应用

    1.下载Tomcat 官网地址:http://tomcat.apache.org/whichversion.html 2.目录结构 bin:脚本目录 启动脚本:startup.bat 停止脚本:shu ...

  6. java中三个类别加载器的关系以及各自加载的类的范围

    Java在需要使用类别的时候,才会将类别加载,Java的类别载入是由类别载入器(Class loader)来达到的,预设上,在程序启动之后,主要会有三个类别加载器:Bootstrap Loader.E ...

  7. Codeforces Round #289 Div 2

    A. Maximum in Table 题意:给定一个表格,它的第一行全为1,第一列全为1,另外的数满足a[i][j]=a[i-1][j]+a[i][j-1],求这个表格中的最大的数 a[n][n]即 ...

  8. split方法切割数组

    指定的字符串按"o"截取 当一个base64需要剪去前面的部分的时候 var params={ "imgJustBase64":this.zheng.split ...

  9. GET,POST请求

    get请求 post请求

  10. luogu P1375 小猫(卡特兰数)

    题意 (n<=200000) 题解 把DP转移方程写出来,这不是卡特兰数吗?然后就解决了. 做完这题我发现 DP真是一个好东西. (公式连乘所以中间要加mod要不爆longlong了) #inc ...