[Luogu2824] [HEOI2016/TJOI2016]排序
题目描述
在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位置上的数字。
输入输出样例
说明
河北省选2016第一天第二题。原题的时限为6s,但是洛谷上是1s,所以洛谷的数据中,对于30%的数据,有 n,m<=1000,对于100%的数据,有 n,m<=30000
二分答案的大小mid。
大于等于mid设为1,其余的设为0.
这样可以用线段树实现$\large O(logN)$排序。
这样排序结束之后如果位置p是1, 就增大l, 否则减小r。
- #include <iostream>
- #include <cstdio>
- using namespace std;
- #define reg register
- inline int read() {
- int res = ;char ch=getchar();
- while(!isdigit(ch)) ch=getchar();
- while(isdigit(ch)) res=(res<<)+(res<<)+(ch^), ch=getchar();
- return res;
- }
- #define N 100010
- int n, m, p, erf;
- int ans;
- int a[N];
- struct Que {
- int l, r, opt;
- }q[N];
- int cnt[N*], lazy[N*];
- #define ls(o) o << 1
- #define rs(o) o << 1 | 1
- inline void pushup(int o)
- {
- cnt[o] = cnt[ls(o)] + cnt[rs(o)];
- }
- void Build(int l, int r, int o)
- {
- lazy[o] = -;
- if (l == r)
- {
- cnt[o] = (a[l] >= erf);
- lazy[o] = -;
- return ;
- }
- int mid = l + r >> ;
- Build(l, mid, ls(o));
- Build(mid + , r, rs(o));
- pushup(o);
- }
- //lazy : 1) -1 means none
- // 2) 1 means change to 1
- // 3) 0 means change to 0
- inline void pushdown(int l, int r, int o)
- {
- if (lazy[o] == -) return ;
- int mid = l + r >> ;
- if (lazy[o] == ) {
- cnt[ls(o)] = mid - l + ;
- lazy[ls(o)] = ;
- cnt[rs(o)] = r - mid;
- lazy[rs(o)] = ;
- lazy[o] = -;
- } else {
- cnt[ls(o)] = , lazy[ls(o)] = ;
- cnt[rs(o)] = , lazy[rs(o)] = ;
- lazy[o] = -;
- }
- }
- void change(int l, int r, int o, int ql, int qr, int c)
- {
- if (l >= ql and r <= qr) {
- if (c) cnt[o] = r - l + , lazy[o] = ;
- else cnt[o] = , lazy[o] = ;
- return;
- }
- pushdown(l, r, o);
- int mid = l + r >> ;
- if (ql <= mid) change(l, mid, ls(o), ql, qr, c);
- if (qr > mid) change(mid + , r, rs(o), ql, qr, c);
- pushup(o);
- }
- int query(int l, int r, int o, int ql, int qr)
- {
- if (l >= ql and r <= qr) return cnt[o];
- pushdown(l, r, o);
- int mid = l + r >> ;
- int res = ;
- if (mid >= ql) res += query(l, mid, ls(o), ql, qr);
- if (mid < qr) res += query(mid + , r, rs(o), ql, qr);
- return res;
- }
- inline bool check(int mid)
- {
- erf = mid;
- Build(, n, );
- // printf("mid = %d\n", mid);
- for (reg int i = ; i <= m ; i ++)
- {
- int L = q[i].l, R = q[i].r;
- int c = query(, n, , L, R);
- if (q[i].opt == ) { //升序
- change(, n, , R - c + , R, );
- change(, n, , L, R - c, );
- } else {
- change(, n, , L, L + c - , );
- change(, n, , L + c, R, );
- }
- }
- // printf("%d\n", query(1, n, 1, p, p));
- return query(, n, , p, p);
- }
- int main()
- {
- n = read(), m = read();
- for (reg int i = ; i <= n ; i ++) a[i] = read();
- for (reg int i = ; i <= m ; i ++) q[i].opt = read(), q[i].l = read(), q[i].r = read();
- p = read();
- int l = , r = n;
- while (l <= r)
- {
- int mid = l + r >> ;
- if (check(mid)) ans = mid, l = mid + ;
- else r = mid - ;
- }
- printf("%d\n", ans);
- return ;
- }
[Luogu2824] [HEOI2016/TJOI2016]排序的更多相关文章
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...
- [HEOI2016/TJOI2016]排序 线段树+二分
[HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...
- [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)
题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...
- 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)
2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...
- [HEOI2016&TJOI2016] 排序(线段树)
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 2703 Solved: 1386[S ...
- [HEOI2016/TJOI2016]排序
嘟嘟嘟 首先这题的暴力是十分好写的,而且据说能得不少分. 正解写起来不难,就是不太好想. 根据做题经验,我想到了给这个序列转化成01序列,但是接下来我就不会了.还是看了题解. 因为查询只有一个数,所以 ...
- 【线段树合并】【P2824】 [HEOI2016/TJOI2016]排序
Description 给定一个长度为 \(n\) 的排列,有 \(m\) 次操作,每次选取一段局部进行升序或降序排序,问你一波操作后某个位置上的数字是几 Hint \(1~\leq~n,~m~\le ...
- 【[HEOI2016/TJOI2016]排序】
巧妙思路题 有一个重要的思想就是把大于某一个数的数都变成\(1\),小于这个数的都变成\(0\),这个只有\(0\)和\(1\)的序列就很好处理了 由于我们只需要在最后求出一个位置上是什么数就可以了, ...
- BZOJ4552:[HEOI2016/TJOI2016]排序——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://www.luogu.org/problemnew/show/P2824 在2 ...
随机推荐
- opencv中IplImage* src = cvLoadImage,错误
在调试这段代码时 IplImage* src = cvLoadImage("D:\\图像\\已处理 - 11.26\\1.jpg", 1); 提示一下错误 引发了异常: 读取访问权 ...
- java需要了解和学习的技能
一:系统架构师是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节.扫清主要难点的技术人员.主要着眼于系统的“技术实现”.因此他/她应该是特定的开发平台.语言.工具的大师 ...
- 小白专场-是否同一颗二叉搜索树-python语言实现
目录 一.二叉搜索树的相同判断 二.问题引入 三.举例分析 四.方法探讨 4.1 中序遍历 4.2 层序遍历 4.3 先序遍历 4.4 后序遍历 五.总结 六.代码实现 一.二叉搜索树的相同判断 二叉 ...
- JS 防抖和节流
防抖和节流 在处理高频事件,类似于window的resize或者scorll,或者input输入校验等操作时.如果直接执行事件处理器,会增大浏览器的负担,严重的直接卡死,用户体验非常不好. 面对这种情 ...
- 基于python-django框架的支付宝支付案例
目录 @ 一. 开发前的准备 1. 必须了解的知识 SDK:软件开发工具包,可以为开发者提供快速开发的工具 沙箱环境:也就是测试环境 支付宝支付金额的精度:小数点后两位(面试) 支付宝用的什么加密方式 ...
- Sping学习笔记(一)----Spring源码阅读环境的搭建
idea搭建spring源码阅读环境 安装gradle Github下载Spring源码 新建学习spring源码的项目 idea搭建spring源码阅读环境 安装gradle 在官网中下载gradl ...
- hbase、pig、hive配置与应用
------------------HBASE---------- [root@iClient~]#sudo yum install hbase #iClient安装Hbase客户端 [root@cM ...
- 小记redis持久化的机制
刚学redis,就经常看到两种持久化机制在眼头晃,RDB和AOF,然而当时学的还知道这两东西是啥玩意,过段时间又忘了,中文记忆这两种概念总感觉有些别扭.今心血来潮翻看redis的配置文件,豁然开朗,仿 ...
- ZK集群如何保证数据一致性源码阅读
什么是数据一致性? 只有当服务端的ZK存在多台时,才会出现数据一致性的问题, 服务端存在多台服务器,他们被划分成了不同的角色,只有一台Leader,多台Follower和多台Observer, 他们中 ...
- Eureka实战-4【开启http basic权限认证】
在我们实际生产环境中,都需要考虑到一个安全问题,比如用户登录,又或者是eureka server,它对外暴露的有自己的rest API,如果没有安全认证,也就意味着别人可以通过rest API随意修改 ...