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
二分答案后转化为01序列,用线段树维护,算是很常见的套路了
代码:
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define M 100010
  5. #define ls node<<1
  6. #define rs node<<1|1
  7. using namespace std;
  8. int n,m,ans,l,r,k;
  9. int a[M],b[M],opt[M],L[M],R[M],val[M<<],tag[M<<];
  10.  
  11. void update(int node) {val[node]=val[ls]+val[rs];}
  12.  
  13. void push(int node,int l,int r)
  14. {
  15. if(tag[node]!=-)
  16. {
  17. int mid=(l+r)/,v=tag[node];
  18. val[ls]=v*(mid-l+);
  19. val[rs]=v*(r-mid);
  20. tag[ls]=tag[rs]=v;
  21. tag[node]=-;
  22. }
  23. }
  24.  
  25. void build(int node,int l,int r)
  26. {
  27. tag[node]=-;
  28. if(l==r) {val[node]=b[l];return;}
  29. int mid=(l+r)/;
  30. build(ls,l,mid); build(rs,mid+,r);
  31. update(node);
  32. }
  33.  
  34. void change(int node,int l,int r,int l1,int r1,int v)
  35. {
  36. if(l1<=l&&r1>=r)
  37. {
  38. tag[node]=v;
  39. val[node]=(r-l+)*v;
  40. return;
  41. }
  42. if(l1>r||r1<l) return;
  43. int mid=(l+r)/; push(node,l,r);
  44. change(ls,l,mid,l1,r1,v); change(rs,mid+,r,l1,r1,v);
  45. update(node);
  46. }
  47.  
  48. int query(int node,int l,int r,int l1,int r1)
  49. {
  50. if(l1<=l&&r1>=r) return val[node];
  51. if(l1>r||r1<l) return ;
  52. int mid=(l+r)/; push(node,l,r);
  53. return query(ls,l,mid,l1,r1)+query(rs,mid+,r,l1,r1);
  54. }
  55.  
  56. bool check(int mid)
  57. {
  58. for(int i=;i<=n;i++)
  59. b[i]=a[i]>=mid?:;
  60. build(,,n);
  61. for(int i=;i<=m;i++)
  62. {
  63. if(opt[i]==)
  64. {
  65. int num=query(,,n,L[i],R[i]);
  66. change(,,n,R[i]-num+,R[i],);
  67. change(,,n,L[i],R[i]-num,);
  68. }
  69. else
  70. {
  71. int num=query(,,n,L[i],R[i]);
  72. change(,,n,L[i],L[i]+num-,);
  73. change(,,n,L[i]+num,R[i],);
  74. }
  75. }
  76. return query(,,n,k,k);
  77. }
  78.  
  79. int main()
  80. {
  81. scanf("%d%d",&n,&m);
  82. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  83. for(int i=;i<=m;i++) scanf("%d%d%d",&opt[i],&L[i],&R[i]);
  84. scanf("%d",&k);l=,r=n;
  85. while(l<=r)
  86. {
  87. int mid=(l+r)/;
  88. if(check(mid)) l=mid+,ans=mid;
  89. else r=mid-;
  90. }
  91. printf("%d",ans);
  92. return ;
  93. }

[BZOJ4552]排序的更多相关文章

  1. bzoj4552排序(线段树,二分)

    题目大意 给定一个长度为n的序列,有m个操作,操作包括两种: \(0\ l\ r\)区间[l,r]的数字升序排序 \(1\ l\ r\)区间[l,r]的数字降序排序 最后询问在q位置上的数是多少? 其 ...

  2. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  3. 【BZOJ4552】排序(线段树,二分答案)

    [BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的 ...

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

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

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

    [BZOJ4552][Tjoi2016&Heoi2016]排序 Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ...

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

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

  7. [bzoj4552][Tjoi2016][Heoi2016]排序

    Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...

  8. BZOJ4552: [Tjoi2016&Heoi2016]排序

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

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

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

随机推荐

  1. Spring的Bean的生命周期以及Bean的后置处理器

    Bean的生命周期: Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进 ...

  2. URI 、URL 和 URN

    URI URI 是 Uniform Resource Identifier 的缩写. Uniform 统一不同类型的资源.比如 txt.mp3.jpeg 等不同的类型的资源都可以使用 URI 来标识 ...

  3. WHICH ONE IS BETTER FOR NEWBIE?

    DROP PROCEDURE IF EXISTS w_array; DELIMITER /w/ )) BEGIN ) DO SET @w = LOCATE(',', w_arr); ); SET @w ...

  4. 并发编程 - io模型 - 总结

    1.提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数2.同步不等于阻塞: 阻塞:遇到io, ...

  5. 自建YUM仓库

    YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系. 要成功的使用YUM工具安装更新软件或系统,就需要有一个包含各种rpm软件包的repository(软件仓库),这个 ...

  6. Javascript闭包学习(Closure)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...

  7. lua获取table的长度

    lua在获取table的size时,不能一味的使用类似于java里面的length函数 table的存储是类似hashTable的kv形式. -- table.getn(tableName) 得到一个 ...

  8. etcd: request cluster ID mismatch错误解决【只适用于新建etcd集群或无数据集群】

    1.报错信息 Mar 29 05:45:31 xxx etcd: request cluster ID mismatch (got 414f8613693e2e2 want cdf818194e3a8 ...

  9. Servlet实现前后端交互的原理及过程解析

    在日常调试项目时,总是利用tomcat去启动项目,并进行前后端联调,但对于前后端的请求响应的交互原理及过程并不是特别清晰. 为什么在前端发出相应请求,就能跳转到后端通过程序得到结果再响应到前端页面呢? ...

  10. 20165324 Java实验三 敏捷开发与XP实验

    20165324 Java实验三 敏捷开发与XP实验 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年4月16日 ...