题目描述

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

输入输出格式

输入格式:

输入数据的第一行为两个整数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

输出格式:

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

输入输出样例

输入样例#1:
复制

  1. 6 3
  2. 1 6 2 5 3 4
  3. 0 1 4
  4. 1 3 6
  5. 0 2 4
  6. 3
输出样例#1: 复制

  1. 5

说明

河北省选2016第一天第二题。原题的时限为6s,但是洛谷上是1s,所以洛谷的数据中,对于30%的数据,有 n,m<=1000,对于100%的数据,有 n,m<=30000


二分答案的大小mid。

大于等于mid设为1,其余的设为0.

这样可以用线段树实现$\large O(logN)$排序。

这样排序结束之后如果位置p是1, 就增大l, 否则减小r。


  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. #define reg register
  5. inline int read() {
  6. int res = ;char ch=getchar();
  7. while(!isdigit(ch)) ch=getchar();
  8. while(isdigit(ch)) res=(res<<)+(res<<)+(ch^), ch=getchar();
  9. return res;
  10. }
  11. #define N 100010
  12.  
  13. int n, m, p, erf;
  14. int ans;
  15. int a[N];
  16. struct Que {
  17. int l, r, opt;
  18. }q[N];
  19. int cnt[N*], lazy[N*];
  20. #define ls(o) o << 1
  21. #define rs(o) o << 1 | 1
  22. inline void pushup(int o)
  23. {
  24. cnt[o] = cnt[ls(o)] + cnt[rs(o)];
  25. }
  26.  
  27. void Build(int l, int r, int o)
  28. {
  29. lazy[o] = -;
  30. if (l == r)
  31. {
  32. cnt[o] = (a[l] >= erf);
  33. lazy[o] = -;
  34. return ;
  35. }
  36. int mid = l + r >> ;
  37. Build(l, mid, ls(o));
  38. Build(mid + , r, rs(o));
  39. pushup(o);
  40. }
  41. //lazy : 1) -1 means none
  42. // 2) 1 means change to 1
  43. // 3) 0 means change to 0
  44. inline void pushdown(int l, int r, int o)
  45. {
  46. if (lazy[o] == -) return ;
  47. int mid = l + r >> ;
  48. if (lazy[o] == ) {
  49. cnt[ls(o)] = mid - l + ;
  50. lazy[ls(o)] = ;
  51.  
  52. cnt[rs(o)] = r - mid;
  53. lazy[rs(o)] = ;
  54.  
  55. lazy[o] = -;
  56. } else {
  57. cnt[ls(o)] = , lazy[ls(o)] = ;
  58. cnt[rs(o)] = , lazy[rs(o)] = ;
  59. lazy[o] = -;
  60. }
  61. }
  62.  
  63. void change(int l, int r, int o, int ql, int qr, int c)
  64. {
  65. if (l >= ql and r <= qr) {
  66. if (c) cnt[o] = r - l + , lazy[o] = ;
  67. else cnt[o] = , lazy[o] = ;
  68. return;
  69. }
  70. pushdown(l, r, o);
  71. int mid = l + r >> ;
  72. if (ql <= mid) change(l, mid, ls(o), ql, qr, c);
  73. if (qr > mid) change(mid + , r, rs(o), ql, qr, c);
  74. pushup(o);
  75. }
  76.  
  77. int query(int l, int r, int o, int ql, int qr)
  78. {
  79. if (l >= ql and r <= qr) return cnt[o];
  80. pushdown(l, r, o);
  81. int mid = l + r >> ;
  82. int res = ;
  83. if (mid >= ql) res += query(l, mid, ls(o), ql, qr);
  84. if (mid < qr) res += query(mid + , r, rs(o), ql, qr);
  85. return res;
  86. }
  87.  
  88. inline bool check(int mid)
  89. {
  90. erf = mid;
  91. Build(, n, );
  92. // printf("mid = %d\n", mid);
  93. for (reg int i = ; i <= m ; i ++)
  94. {
  95. int L = q[i].l, R = q[i].r;
  96. int c = query(, n, , L, R);
  97. if (q[i].opt == ) { //升序
  98. change(, n, , R - c + , R, );
  99. change(, n, , L, R - c, );
  100. } else {
  101. change(, n, , L, L + c - , );
  102. change(, n, , L + c, R, );
  103. }
  104. }
  105. // printf("%d\n", query(1, n, 1, p, p));
  106. return query(, n, , p, p);
  107. }
  108.  
  109. int main()
  110. {
  111. n = read(), m = read();
  112. for (reg int i = ; i <= n ; i ++) a[i] = read();
  113. for (reg int i = ; i <= m ; i ++) q[i].opt = read(), q[i].l = read(), q[i].r = read();
  114. p = read();
  115. int l = , r = n;
  116. while (l <= r)
  117. {
  118. int mid = l + r >> ;
  119. if (check(mid)) ans = mid, l = mid + ;
  120. else r = mid - ;
  121. }
  122. printf("%d\n", ans);
  123. return ;
  124. }

[Luogu2824] [HEOI2016/TJOI2016]排序的更多相关文章

  1. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

  2. [HEOI2016/TJOI2016]排序 线段树+二分

    [HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...

  3. [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)

    题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...

  4. 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)

    2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...

  5. [HEOI2016&TJOI2016] 排序(线段树)

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 2703  Solved: 1386[S ...

  6. [HEOI2016/TJOI2016]排序

    嘟嘟嘟 首先这题的暴力是十分好写的,而且据说能得不少分. 正解写起来不难,就是不太好想. 根据做题经验,我想到了给这个序列转化成01序列,但是接下来我就不会了.还是看了题解. 因为查询只有一个数,所以 ...

  7. 【线段树合并】【P2824】 [HEOI2016/TJOI2016]排序

    Description 给定一个长度为 \(n\) 的排列,有 \(m\) 次操作,每次选取一段局部进行升序或降序排序,问你一波操作后某个位置上的数字是几 Hint \(1~\leq~n,~m~\le ...

  8. 【[HEOI2016/TJOI2016]排序】

    巧妙思路题 有一个重要的思想就是把大于某一个数的数都变成\(1\),小于这个数的都变成\(0\),这个只有\(0\)和\(1\)的序列就很好处理了 由于我们只需要在最后求出一个位置上是什么数就可以了, ...

  9. BZOJ4552:[HEOI2016/TJOI2016]排序——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://www.luogu.org/problemnew/show/P2824 在2 ...

随机推荐

  1. opencv中IplImage* src = cvLoadImage,错误

    在调试这段代码时 IplImage* src = cvLoadImage("D:\\图像\\已处理 - 11.26\\1.jpg", 1); 提示一下错误 引发了异常: 读取访问权 ...

  2. java需要了解和学习的技能

    一:系统架构师是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节.扫清主要难点的技术人员.主要着眼于系统的“技术实现”.因此他/她应该是特定的开发平台.语言.工具的大师 ...

  3. 小白专场-是否同一颗二叉搜索树-python语言实现

    目录 一.二叉搜索树的相同判断 二.问题引入 三.举例分析 四.方法探讨 4.1 中序遍历 4.2 层序遍历 4.3 先序遍历 4.4 后序遍历 五.总结 六.代码实现 一.二叉搜索树的相同判断 二叉 ...

  4. JS 防抖和节流

    防抖和节流 在处理高频事件,类似于window的resize或者scorll,或者input输入校验等操作时.如果直接执行事件处理器,会增大浏览器的负担,严重的直接卡死,用户体验非常不好. 面对这种情 ...

  5. 基于python-django框架的支付宝支付案例

    目录 @ 一. 开发前的准备 1. 必须了解的知识 SDK:软件开发工具包,可以为开发者提供快速开发的工具 沙箱环境:也就是测试环境 支付宝支付金额的精度:小数点后两位(面试) 支付宝用的什么加密方式 ...

  6. Sping学习笔记(一)----Spring源码阅读环境的搭建

    idea搭建spring源码阅读环境 安装gradle Github下载Spring源码 新建学习spring源码的项目 idea搭建spring源码阅读环境 安装gradle 在官网中下载gradl ...

  7. hbase、pig、hive配置与应用

    ------------------HBASE---------- [root@iClient~]#sudo yum install hbase #iClient安装Hbase客户端 [root@cM ...

  8. 小记redis持久化的机制

    刚学redis,就经常看到两种持久化机制在眼头晃,RDB和AOF,然而当时学的还知道这两东西是啥玩意,过段时间又忘了,中文记忆这两种概念总感觉有些别扭.今心血来潮翻看redis的配置文件,豁然开朗,仿 ...

  9. ZK集群如何保证数据一致性源码阅读

    什么是数据一致性? 只有当服务端的ZK存在多台时,才会出现数据一致性的问题, 服务端存在多台服务器,他们被划分成了不同的角色,只有一台Leader,多台Follower和多台Observer, 他们中 ...

  10. Eureka实战-4【开启http basic权限认证】

    在我们实际生产环境中,都需要考虑到一个安全问题,比如用户登录,又或者是eureka server,它对外暴露的有自己的rest API,如果没有安全认证,也就意味着别人可以通过rest API随意修改 ...