P2824 [HEOI2016/TJOI2016] 排序

P2824 [HEOI2016/TJOI2016] 排序

[HEOI2016/TJOI2016] 排序

题目描述

2016 2016 2016 年,佳媛姐姐喜欢上了数字序列。因而她经常研究关于序列的一些奇奇怪怪的问题,现在她在研究一个难题,需要你来帮助她。

这个难题是这样子的:给出一个 1 1 1 n n n 的排列,现在对这个排列序列进行 m m m 次局部排序,排序分为两种:

  • 0 l r 表示将区间 [ l , r ] [l,r] [l,r] 的数字升序排序
  • 1 l r 表示将区间 [ l , r ] [l,r] [l,r] 的数字降序排序

注意,这里是对下标在区间 [ l , r ] [l,r] [l,r] 内的数排序。
最后询问第 q q q 位置上的数字。

输入格式

输入数据的第一行为两个整数 n n n m m m n n n 表示序列的长度, m m m 表示局部排序的次数。

第二行为 n n n 个整数,表示 1 1 1 n n n 的一个排列。

接下来输入 m m m 行,每一行有三个整数 op , l , r \text{op},l,r op,l,r op \text{op} op 0 0 0 代表升序排序, op \text{op} op 1 1 1 代表降序排序, l , r l,r l,r 表示排序的区间。

最后输入一个整数 q q q,表示排序完之后询问的位置

输出格式

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

样例 #1

样例输入 #1

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

样例输出 #1

5

提示

河北省选2016第一天第二题。

对于 30 % 30\% 30% 的数据, n , m ≤ 1000 n,m\leq 1000 n,m1000

对于 100 % 100\% 100% 的数据, n , m ≤ 1 0 5 n,m\leq 10^5 n,m105 1 ≤ q ≤ n 1\leq q\leq n 1qn

解析:

排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),总的时间复杂度为 O ( n m l o g m ) O(nmlogm) O(nmlogm) ,会超时。

对于 01序列 的排序(以升序为例)可以简化排序的过程:

  • 将前部分置 0,将后部分置 1

01序列 的排序实际上是去区间查询,区间修改:

  • 查询 [ l , r ] [l,r] [l,r] 区间中 1 1 1 的个数为 c n t 1 cnt_1 cnt1
  • 将区间 [ r − c n t 1 + 1 , r ] [r-cnt_1+1, r] [rcnt1+1,r] 置 1,将区间 [ l , r − c n t 1 ] [l, r-cnt_1] [l,rcnt1] 置 0

接下来考虑如何将序列转化为 01序列:

对于猜测答案 x x x,将序列中小于 x x x 的数置 0,大于等于 x x x 的数置 1,即可得到 01序列

答案是否具有单调性:

对 01序列 进行局部排序操作,然后查询 q q q 位置的数:

  • 如果为1,则说明正确答案大于等于 x x x
  • 如果为0,则说明正确答案小于 x x x

因此具有单调性,所以可以二分答案。

总的时间复杂度为 O ( m l o g 2 n ) O(mlog^2n) O(mlog2n)

代码中需要注意的是:

  • 特判一下 全0/全1 的排序
  • 每次二分检查的时候,需要将线段树清空,尤其是 lazytag,不要只清零叶子节点的 lazytag(悲)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define fi first
#define se second
#define debug(x) cerr << #x << ": " << (x) << endl
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
const int maxn = 1e5+10;
const int maxm = 1e5+10;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> pii;inline int ls(int x){return x << 1;}
inline int rs(int x){return x << 1 | 1;}
struct Query{int op, l, r;
}q[maxn];
struct node{int sum; // 1 的个数 int tag;
}t[maxn << 2];
int n, m, p;
int a[maxn], b[maxn];void init(int x){for(int i = 1; i <= n; i++){if(a[i] < x)b[i] = 0;elseb[i] = 1;}
}
void pushup(int k){t[k].sum = t[ls(k)].sum + t[rs(k)].sum;
}
void build(int k, int l, int r){t[k].tag = 0;if(l == r){t[k].sum = b[l];		return;}int mid = (l+r) >> 1;build(ls(k), l, mid);build(rs(k), mid+1, r);pushup(k);
}// tag = 0 : 无事发生
// tag = 1 : 全为 0
// tag = 2 : 全为 1
void pushdown(int k, int l, int r){if(t[k].tag == 0)return;if(t[k].tag == 1){t[ls(k)].sum = 0;t[rs(k)].sum = 0;}else if(t[k].tag == 2){int mid = (l+r) >> 1;t[ls(k)].sum = mid - l + 1;t[rs(k)].sum = r - mid;}t[ls(k)].tag = t[rs(k)].tag = t[k].tag;t[k].tag = 0; 
}
void modify(int k, int l, int r, int x, int y, int v){if(x <= l && y >= r){t[k].tag = v;if(v == 1) t[k].sum = 0;if(v == 2) t[k].sum = r-l+1;return;}pushdown(k, l, r);int mid = (l+r) >> 1;if(x <= mid)modify(ls(k), l, mid, x, y, v);if(y > mid)modify(rs(k), mid+1, r, x, y, v);pushup(k);
}
int querycnt1(int k, int l, int r, int x, int y){if(x <= l && y >= r)return t[k].sum;int mid = (l+r) >> 1;pushdown(k, l, r);int res = 0;if(x <= mid)res += querycnt1(ls(k), l, mid, x, y);if(y > mid)res += querycnt1(rs(k), mid+1, r, x, y);return res;
}
int querypos(int k, int l, int r, int pos){if(l == r && l == pos)return t[k].sum;pushdown(k, l, r);int mid = (l+r) >> 1;int res;if(pos <= mid)res = querypos(ls(k), l, mid, pos);elseres = querypos(rs(k), mid+1, r, pos);return res;
}
bool check(int x){init(x);build(1, 1, n);for(int i = 1; i <= m; i++){int cnt1 = querycnt1(1, 1, n, q[i].l, q[i].r); if(cnt1 == 0 || cnt1 == (q[i].r - q[i].l + 1))continue;if(q[i].op == 0){ // 升序 modify(1, 1, n, q[i].l, q[i].r-cnt1, 1);modify(1, 1, n, q[i].r-cnt1+1, q[i].r, 2);}else if(q[i].op == 1){ // 降序 modify(1, 1, n, q[i].l+cnt1, q[i].r, 1);modify(1, 1, n, q[i].l, cnt1+q[i].l-1, 2);			 }}int res = querypos(1, 1, n, p);return res == 1;
}
int main(){ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; i++)cin >> a[i];for(int i = 1; i <= m; i++)cin >> q[i].op >> q[i].l >> q[i].r;cin >> p; int l = 1, r = n, res;while(l <= r){int mid = (l+r) >> 1;if(check(mid)){res = mid;l = mid + 1;}elser = mid - 1;}cout << res << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 创建git项目并提交到gitee(保姆式教程)

01、git安装与初始化设置 mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ apt install mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ git config --global user.name "用户名" mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ git config --global user.ema…

Python自定义函数练习(持续更新中~)

1.计算矩阵的面积和周长&#xff1a; class Rectangle:def __init__(self, width, height):self.width widthself.height heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width self.height)if __name__ "__main__"…

深入理解JS中的this

1、浅谈this 1.1、调用位置 在学习this的绑定过程之前&#xff0c;首先要理解调用位置&#xff0c;即函数在代码中被调用的位置&#xff0c;因此我们需要分析调用栈&#xff0c;看以下代码 function baz(){// 当前调用栈是baz// 因此调用位置就是全局作用域console。log(&qu…

财务RPA机器人如何使用

随着科技的不断发展&#xff0c;自动化技术在各个领域得到了广泛应用&#xff0c;在财务领域&#xff0c;RPA机器人已经成为一种新兴的技术手段&#xff0c;帮助众多企业实现了财务流程的自动化&#xff0c;大大提高了工作效率&#xff0c;降低人力成本。 本文将详细介绍财务RP…

AtCoder Beginner Contest 327 G. Many Good Tuple Problems(带标号二分图计数+有区别小球放入有区别盒子)

题目 一个长为n(n<30)的原始序列x&#xff0c;x[i]可以取值0或1 一个长为m(m<1e9)的点对序列(s,t)&#xff0c; s序列第i项和t的第i项&#xff0c;均可以取值[1,n]&#xff0c; 如果构造好s和t后&#xff0c;对任意都存在01序列x使得&#xff0c; 则称这个序列是合法…

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…

MySQL5.7小版本升级-In-Place方式

在 Centos7.9上升级二进制方式安装的MySQL 。升级方式有就地升级和逻辑升级2种方法&#xff0c;本实验演示In-Place Upgrade就地升级的方式将mysql-5.7.17升级至5.7.44 In-Place Upgrade就地升级Logical Upgrade逻辑升级 升级方式介绍 In-Place Upgrade就地升级 In-Place U…

perl列表创建、追加、删除

简介 perl 列表追加元素 主要是通过push和unshift函数来实现。其中&#xff0c;push是追加到列表尾&#xff0c;unshift是追加到列表头。 perl列表删除元素 主要是通过pop和shift函数来实现。其中&#xff0c;pop是从列表尾删除一个元素&#xff0c; shift是从列表头删除一…

6大场景,玩转ChatGPT!

文章目录 一、故事叙述提问举例 二、产品描述提问举例 三、报告撰写提问举例 四、邮件和信件撰写提问举例 五、新间稿和公告撰写提问举例 六、学术论文和专业文章撰写提问举例 本文是在GPT3.5版本下演示的 我们知道AI技术不仅能够自动生成文章和内容&#xff0c;还可以根据我们…

【大数据】NiFi 中的重要术语

NiFi 中的重要术语 1.Flow Controller2.Processor3.Connection4.Controller Service5.Process Group6.FlowFile 那些一个个黑匣子称为 Processor&#xff0c;它们通过称为 Connection 的队列交换名为 FlowFile 的信息块。最后&#xff0c;FlowFile Controller 负责管理这些组件…

软考高级系统架构设计师系列之:软考高级系统架构设计师论文专题

软考高级系统架构设计师系列之:软考高级系统架构设计师论文专题 一、论文相关内容二、论文专题大纲三、论文考试方式四、历年真题汇总分析五、论文常见问题六、论文评分标准七、搭建论文万能模版八、论文万能模版公式九、搭建论文万能模版—摘要十、搭建论文万能模版—背景十一…

XSAN数据恢复-存储空间架构迁移时误格式化存储系统的XSAN数据恢复案例

XSAN数据恢复环境&#xff1a; 昆腾存储&#xff0c;MAC OS操作系统&#xff0c;存放视频类数据&#xff08;MXF、MOV等格式文件&#xff09;。 XSAN故障&检测&#xff1a; 将存储空间从XSAN架构迁移到STORNEXT架构后&#xff0c;存储空间中数据全部丢失。 故障存储中一共…

Oracle常用运维SQL-SQL执行性能及锁表等查询分析

oracle相关系列文章: docker–在Anaconda jupyter 容器中使用oracle数据源时,Oracle客户端安装配置及使用示例 Oracle常用运维SQL–用户管理、数据导入、导出的实用脚本 Oracle TEMPORARY TABLE 临时表的使用及删除报ORA-14452错误的解决办法 Oracle常用运维SQL-SQL执行性能及…

R 复习 菜鸟教程

R语言老师说R好就业&#xff0c;学就完了 基础语法 cat()可以拼接函数&#xff1a; > cat(1, "加", 1, "等于", 2, \n) 1 加 1 等于 2sink()&#xff1a;重定向 sink("r_test.txt", splitTRUE) # 控制台同样输出 for (i in 1:5) print(i…

蓝桥杯官网填空题(方格计数)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如下图所示&#xff0c;在二维平面上有无数个 11 的小方格。 我们以某个小方格的一个顶点为圆心画一个半径为 50000 的圆。 你能计算出这个圆里有多少个完整的小方…

【星海出品】VUE(五)

表单 表单输入绑定 只需要v-model声明一下这个变量就可以。 还可以选择不同的类型&#xff0c;例如 type"checkbox“ v-model 也提供了 lazy、number、.trim 功能&#xff0c;只需要在v-model后面加入.lazy 例如&#xff1a;v-model.lazy”message“ <template><…

Azure 机器学习 - 设置 AutoML 训练时序预测模型

目录 一、环境准备二、训练和验证数据三、配置试验支持的模型配置设置特征化步骤自定义特征化 四、可选配置频率和目标数据聚合启用深度学习目标滚动窗口聚合短时序处理非稳定时序检测和处理 五、运行试验六、用最佳模型进行预测用滚动预测评估模型精度预测未来 七、大规模预测…

Flink源码解析八之任务调度和负载均衡

源码概览 jobmanager scheduler:这部分与 Flink 的任务调度有关。 CoLocationConstraint:这是一个约束类,用于确保某些算子的不同子任务在同一个 TaskManager 上运行。这通常用于状态共享或算子链的情况。CoLocationGroup & CoLocationGroupImpl:这些与 CoLocationCon…

css主题切换

html <!DOCTYPE html> <html> <head><title>主题切换示例</title> </head> <body><div class"app"><button id"themeButton">切换主题</button><div class"content"><h1…

已完结,给小白的《50讲Python自动化办公》

大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯也叫这个名。 写在前面 上个周末去成都参加了第8届中国开源年会&#xff0c;认识了很多行业前辈和优秀的同龄人。 我发现在工作之外还能有一番事业的人&#xff0c;都有一个让我羡慕的共同点&#xff1a;有一个拿得出手…