【BZOJ4552】[Tjoi2016&Heoi2016]排序

Description

在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他。这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字。

Input

输入数据的第一行为两个整数n和m。n表示序列的长度,m表示局部排序的次数。1 <= n, m <= 10^5第二行为n个整数,表示1到n的一个全排列。接下来输入m行,每一行有三个整数op, l, r, op为0代表升序排序,op为1代表降序排序, l, r 表示排序的区间。最后输入一个整数q,q表示排序完之后询问的位置, 1 <= q <= n。1 <= n <= 10^5,1 <= m <= 10^5

Output

输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。

Sample Input

6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3

Sample Output

5

题解:思路非常巧妙,先二分答案,然后将>=mid的位置看成1,其余看成0,然后排序就变成了将段区间的1全都放到左边或右边,这个用线段树很容易搞定。

单调性也十分显然,如果原来的结果是1,那么在增加一个1后,结果不可能变为0;如果原来的结果是0,那么在去掉一个1后,结果不可能变为1。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define lson x<<1
  5. #define rson x<<1|1
  6. using namespace std;
  7. const int maxn=100010;
  8. int n,m,now,pos;
  9.  
  10. int s[maxn<<2],tag[maxn<<2],pa[maxn],pb[maxn],op[maxn],v[maxn];
  11. inline int rd()
  12. {
  13. int ret=0,f=1; char gc=getchar();
  14. while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
  15. while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
  16. return ret*f;
  17. }
  18. inline void pushdown(int l,int r,int x)
  19. {
  20. if(tag[x]!=-1)
  21. {
  22. int mid=(l+r)>>1;
  23. s[lson]=(mid-l+1)*tag[x],s[rson]=(r-mid)*tag[x],tag[lson]=tag[rson]=tag[x];
  24. tag[x]=-1;
  25. }
  26. }
  27. void build(int l,int r,int x)
  28. {
  29. tag[x]=-1;
  30. if(l==r)
  31. {
  32. s[x]=(v[l]>=now);
  33. return ;
  34. }
  35. int mid=(l+r)>>1;
  36. build(l,mid,lson),build(mid+1,r,rson);
  37. s[x]=s[lson]+s[rson];
  38. }
  39. void updata(int l,int r,int x,int a,int b,int c)
  40. {
  41. if(a>b) return ;
  42. if(a<=l&&r<=b)
  43. {
  44. s[x]=(r-l+1)*c,tag[x]=c;
  45. return ;
  46. }
  47. pushdown(l,r,x);
  48. int mid=(l+r)>>1;
  49. if(a<=mid) updata(l,mid,lson,a,b,c);
  50. if(b>mid) updata(mid+1,r,rson,a,b,c);
  51. s[x]=s[lson]+s[rson];
  52. }
  53. int query(int l,int r,int x,int a,int b)
  54. {
  55. if(a<=l&&r<=b) return s[x];
  56. pushdown(l,r,x);
  57. int mid=(l+r)>>1;
  58. if(b<=mid) return query(l,mid,lson,a,b);
  59. if(a>mid) return query(mid+1,r,rson,a,b);
  60. return query(l,mid,lson,a,b)+query(mid+1,r,rson,a,b);
  61. }
  62. bool check()
  63. {
  64. build(1,n,1);
  65. int i,a;
  66. for(i=1;i<=m;i++)
  67. {
  68. a=query(1,n,1,pa[i],pb[i]);
  69. if(op[i]) updata(1,n,1,pa[i],pa[i]+a-1,1),updata(1,n,1,pa[i]+a,pb[i],0);
  70. else updata(1,n,1,pa[i],pb[i]-a,0),updata(1,n,1,pb[i]-a+1,pb[i],1);
  71. }
  72. return query(1,n,1,pos,pos);
  73. }
  74. int main()
  75. {
  76. n=rd(),m=rd();
  77. int i,l=1,r=n+1;
  78. for(i=1;i<=n;i++) v[i]=rd();
  79. for(i=1;i<=m;i++) op[i]=rd(),pa[i]=rd(),pb[i]=rd();
  80. pos=rd();
  81. while(l<r)
  82. {
  83. now=(l+r)>>1;
  84. if(check()) l=now+1;
  85. else r=now;
  86. }
  87. printf("%d",l-1);
  88. return 0;
  89. }

【BZOJ4552】[Tjoi2016&Heoi2016]排序 二分+线段树的更多相关文章

  1. [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树

    Brief Description DZY有一个数列a[1..n],它是1∼n这n个正整数的一个排列. 现在他想支持两种操作: 0, l, r: 将a[l..r]原地升序排序. 1, l, r: 将a ...

  2. bzoj 4552: [Tjoi2016&Heoi2016]排序——二分+线段树

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  3. [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)

    解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...

  4. bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序

    http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...

  5. BZOJ4552 [Tjoi2016&Heoi2016]排序 【二分 + 线段树】

    题目链接 BZOJ4552 题解 之前去雅礼培训做过一道题,\(O(nlogn)\)维护区间排序并能在线查询 可惜我至今不能get 但这道题有着\(O(nlog^2n)\)的离线算法 我们看到询问只有 ...

  6. BZOJ4552:[TJOI2016&HEOI2016]排序(线段树,二分)

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  7. 2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

    传送门 线段树简单题. 二分答案+线段树排序. 实际上就是二分答案mid" role="presentation" style="position: relat ...

  8. BZOJ4552 Tjoi2016&Heoi2016排序 【二分+线段树】*

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个 ...

  9. [BZOJ4552][Tjoi2016&Heoi2016]排序(二分答案+线段树)

    二分答案mid,将>=mid的设为1,<mid的设为0,这样排序就变成了区间修改的操作,维护一下区间和即可 然后询问第q个位置的值,为1说明>=mid,以上 时间复杂度O(nlog2 ...

随机推荐

  1. 【Shiro】Apache Shiro架构之权限认证(Authorization)

    Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shir ...

  2. 浅析C#中 ConcurrentDictionary的实现

    简单画了一张图 (灵魂画手 →_→) 如图 ConcurrentDictionary 其中有个tables 对象主要存储,而这个 tables 是一个 很多区块的 数组 ,每个区块 又是一个node的 ...

  3. Strace--系统调用分析问题集锦

    ---------------------------------------------------------------------------------------------------- ...

  4. json再理解

    一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第 ...

  5. 3.3v转5v开关电源芯片LM2731

    方案一 输入3.3(可为2.7~14v):输出5v,700ma.已经过实际验证. 其中:C1,C2为贴片陶瓷电容,Cf也为贴片陶瓷电容,L1为6.8uH 电感 输出值只和R1,R2的值有关,但手册中又 ...

  6. NOPcommerce研究

    http://www.cnblogs.com/gusixing/archive/2012/04/07/2435873.html

  7. iOS多线程与网络开发之NSURLCache

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. // 2 // ViewController.m 3 // NSURLCacheDemo 4 // 5 // Created by haomengzhu ...

  8. python学习之range()和xrange()

    在python2中,xrange()返回一个xrange对象,注意这个对象并不是生成器,也不是迭代器,但是是迭代对象. 而range()则返回列表对象. >>> range(10) ...

  9. IE的layout布局

    我们那知道浏览器有bug,而且Windows上的lE的bug 似乎比太多数浏览器都多.IE/Win的表现与其他浏览器不同的原因之一是,显示引擎使用一个称为布局(layout)的内部概念.因为布均是一个 ...

  10. java之Thread Dump分析

    什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机 ...