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

[HEOI2016/TJOI2016]排序

内存限制:256 MiB 时间限制:6000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
题目描述

在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位置上的数字。

样例

样例输入

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

样例输出

5

题解:

思路挺神仙的

这题你要是真的去排序就死了。。。

但我们还是要用到线段树

但和tree这道kruscal一样思路非常神奇

我们二分q位置上的数

每一次二分,维护一个线段树,

我们设当前分到的数是x,那么我们让所有大于等于x的叶节点为1,小于x为0

这样我们维护区间中有几个1,

如果升序排序我们就把前一段暴力改成1,后一段改成0,降序反过来

这样我们查询q位置是什么数

如果是1,则当前二分的x可能偏小,但可能就是答案,要用mid更新ans,因为我们是让大于等于x的节点为1,

如果是0,则说明当前x偏大,应查询较小的数

每次二分都这样检查一遍,二分结束的ans就是答案

反套路题,多多积累

posted @   xukl21  阅读(207)  评论(0编辑  收藏  举报
编辑推荐:
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
阅读排行:
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp
· drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程
点击右上角即可分享
微信分享提示