P2824 [HEOI2016/TJOI2016] 排序

news2024/11/23 19:59:34

题目

在这里插入图片描述

思路

直接模拟排序肯定会TLE,所以我们想一种离线的方法:01排序
利用二分答案check一下d,设序列中大于等于d的数为1,小于d的数为0
完成后再进行排序:这样升序排列就是将0放前面1放后面,降序排列则相反
“放”这一操作还可以优化:降序排序中,先输出一共有num个1,然后把前num个数设成1,后面的数设成0,升序排列则相反
在全部模拟完后,我们看看第q位上的数是0还是1,若是1,则代表 a q a_q aq是大于等于二分答案d,也就是说需要将l右移,反之左移
证明: a q > = d , 若使二分答案 d 更接近最终答案,需要将 d 增大,也就是 l = m i d + 1 a_q>=d,若使二分答案d更接近最终答案,需要将d增大,也就是l=mid+1 aq>=d,若使二分答案d更接近最终答案,需要将d增大,也就是l=mid+1
因为用到了区间操作,所以我们用线段树做
理论存在,实践开始

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f
const int M=1e7+5;
struct node{
	int opt,l,r;
}qs[M];
istream& operator >> (istream& in,node& t){
	in>>t.opt>>t.l>>t.r;
	return in;
}
int a[M];
int n,m;
int q;
int maxn=-INF;
struct seg{
	#define lc(x) x<<1
	#define rc(x) x<<1|1
	int tag[M<<2],v[M<<2];
	bool vis[M<<2];
	void cover(int x,int l,int r,int k){//记录tag+更改操作
		tag[x]=k,vis[x]=1;
		v[x]=k*(r-l+1);
	}
	void pushup(int x) { v[x]=v[lc(x)]+v[rc(x)]; }//向上更改
	void pushdown(int x,int l,int r){//向下更改
		if(!vis[x]) return;
		int mid=l+r>>1;
		cover(lc(x),l,mid,tag[x]),cover(rc(x),mid+1,r,tag[x]);
		tag[x]=0,vis[x]=0;
	}
	void build(int x,int l,int r,int k){//建树
		vis[x]=0;
		if(l==r) { v[x]=(a[l]>=k);return; }
		int mid=l+r>>1;
		build(lc(x),l,mid,k),build(rc(x),mid+1,r,k);
		pushup(x);
	}
	int query(int ql,int qr,int x,int l,int r){//查询区间和的数量
		if(ql>qr) return 0;//特殊情况判断
		if(ql<=l&&r<=qr) return v[x];
		int ans=0;
		int mid=l+r>>1;
		pushdown(x,l,r);
		if(ql<=mid) ans+=query(ql,qr,lc(x),l,mid);//特殊情况
		if(mid+1<=qr) ans+=query(ql,qr,rc(x),mid+1,r);
		pushup(x);
		return ans;
	}
	void update(int ql,int qr,int x,int l,int r,int k){
		if(ql>qr) return;
		if(ql<=l&&r<=qr) { cover(x,l,r,k);return; }
		pushdown(x,l,r);
		int mid=l+r>>1;
		if(ql<=mid) update(ql,qr,lc(x),l,mid,k);
		if(mid+1<=qr) update(ql,qr,rc(x),mid+1,r,k);
		pushup(x);
	}
}st;
bool check(int d){
	st.build(1,1,n,d);
	int num;
	for(int i=1;i<=m;i++){
		int l=qs[i].l;int r=qs[i].r;
		num=st.query(l,r,1,1,n);
		switch (qs[i].opt){
			case 1:st.update(l,l+num-1,1,1,n,1),st.update(l+num,r,1,1,n,0);break;//升序(前1后0)
			case 0:num=r-l+1-num;st.update(l,l+num-1,1,1,n,0),st.update(l+num,r,1,1,n,1);break;//降序(前0后1)
		}
	}
	return st.query(q,q,1,1,n);//查询a[q]的值
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i],maxn=max(maxn,a[i]);
	for(int i=1;i<=m;i++) cin>>qs[i];
	cin>>q;
	int l=1,r=maxn,ans;
	while(l<=r){
		int mid=l+r>>1;
		if(check(mid)) l=mid+1,ans=mid;
		else r=mid-1;
	}
	cout<<ans;
	return 0;
}

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

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

相关文章

Linux下C/C++的gdb工具与Python的pdb工具常见用法之对比

1、gdb和pdb分别是什么&#xff1f; 1.1、gdb GDB&#xff08;GNU Debugger&#xff09;是一个功能强大的命令行调试工具&#xff0c;由GNU项目开发&#xff0c;用于调试C、C等编程语言的程序。它在多个操作系统中都可以使用&#xff0c;包括Linux、MacOS和Windows&#xff0…

C#与C/C++交互(1)——需要了解的基础知识

【前言】 C#中用于实现调用C/C的方案是P/Invoke&#xff08;Platform Invoke&#xff09;&#xff0c;让托管代码可以调用库中的函数。类似的功能&#xff0c;JAVA中叫JNI&#xff0c;Python中叫Ctypes。 常见的代码用法如下&#xff1a; [DllImport("Test.dll", E…

关于游戏的笔记

关于搭建秦时明月2一键端&#xff0c;并且开启秘境神秘商人东海寻仙幻化 1.该游戏下主要的目录 gm端 服务框架 服务端 2.修改对应的文件 C:\qs\Q2Server\server\conf_common\ManagerAddress.xmlC:\qs\Q2Server\server\conf_manager\GateServer.xml修改ip 3.启动gm startup…

SpringCloud(32):Nacos配置管理应用于分布式系统

1 从单体架构到微服务 1.1 单体架构 Web应用程序发展的早期&#xff0c;大部分web工程师将所有的功能模块打包到一起并放在一个web容器中运行&#xff0c;所有功能 模块使用同一个数据库&#xff0c;同时&#xff0c;它还提供API或者UI访问的web模块等。 尽管也是模块化逻辑…

事务,不只ACID | 京东物流技术团队

1. 什么是事务&#xff1f; 应用在运行时可能会发生数据库、硬件的故障&#xff0c;应用与数据库的网络连接断开或多个客户端端并发修改数据导致预期之外的数据覆盖问题&#xff0c;为了提高应用的可靠性和数据的一致性&#xff0c;事务应运而生。 从概念上讲&#xff0c;事务…

ML之特征工程进阶

术语表 术语 释义 sklearn fraternization 特征工程 Feature scaling 特征缩放 Feature Retrieval 特征检索 NLP 全称: Natural Language Processing 自然语言处理 Corpus 语料库 特征工程概述 定义 特征工程并非是一个问题&#xff0c;而是关于特征的一系列问题…

这应该是最全的,Fiddler手机App抓包详解,看完还不会来找我...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是抓包&#…

Centos7配置网卡信息及固定IP

找到网卡配置文件 Centos7之后的网卡配置文件统一放在/etc/sysconfig/network-scripts&#xff0c;在这个目录会找到以ifcfg开头的&#xff0c;和本机网卡数量对应的配置文件&#xff0c;如下: 执行该命令,进入该目录: cd /etc/sysconfig/network-scripts 再执行该命令 ll …

DAY02_Spring—第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

Killing LeetCode [83] 删除排序链表中的重复元素

Description 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 Intro Ref Link&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-list/ Difficulty&#xff1a;Easy Tag&am…

生信学院|08月18日《基于Flow Simulation的冷链运输产品案例》

课程主题&#xff1a;基于Flow Simulation的冷链运输产品案例 课程时间&#xff1a;2023年08月18日 14:00-14:30 主讲人&#xff1a;江流洋 生信科技 CAE专家 1、达索仿真方案介绍 2、项目介绍 3、案例分析 请安装腾讯会议客户端或APP&#xff0c;微信扫描海报中的二维码…

消息队列常见问题(1)-如何保障不丢消息

目录 1. 为什么消息队列会丢消息&#xff1f; 2. 怎么保障消息可靠传递&#xff1f; 2.1 生产者不丢消息 2.2 服务端不丢消息 2.3 消费者不丢消息 3. 消息丢失如何快速止损&#xff1f; 3.1 完善监控 3.2 完善止损工具 1. 为什么消息队列会丢消息&#xff1f; 现在主流…

0140 数据链路层2

目录 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 1.如果使用5类UTP来设计一个覆盖范围为200m的10BASE-T以太网&#xff0c;需要采用的设备是&#xff08;&#xff09; A.放大器 …

11. Redis基础知识

文章目录 一、概述二、数据类型STRINGLISTSETHASHZSET 三、数据结构字典跳跃表 四、使用场景计数器缓存查找表消息队列会话缓存分布式锁实现其它 五、Redis 与 Memcached数据类型数据持久化分布式内存管理机制 六、键的过期时间七、数据淘汰策略八、持久化RDB 持久化AOF 持久化…

网络可靠性之链路聚合

网络的可靠性 网络的可靠性指当设备或者链路出现单点或者多点故障时保证网络服务不间断的能力网络的可靠性是可以从单板、设备、链路多个层面实现。 链路聚合 以太网链路聚合&#xff1a; 通过将多个物理接口捆绑成为一个逻辑接口&#xff0c;可以再不进行硬件升级的条件下&a…

新手注意事项-visual studio 来实现别踩白块儿

自己之前为了熟悉easyx练习过一个简单的项目&#xff0c;别踩白块儿&#xff0c;链接在这里&#xff0c;别踩白块儿&#xff0c;当时比较稚嫩&#xff0c;很多东西都不会&#xff0c;可以说是只知道最基本的语法&#xff0c;头文件都不知道&#xff0c;一个一个查资料弄懂的&am…

实现无限存储:基于JuiceFS 创建 Samba 和 NFS 共享

随着企业数据量的持续增长&#xff0c;存储容量需求日益增大。如何采用没有容量上限的云存储替换本容量有限的本地磁盘&#xff0c;已成为广泛的需求和共识。特别是在企业中常用的 Samba 和 NFS 共享&#xff0c;如果能够使用云存储作为底层存储&#xff0c;就能有效解决存储扩…

产品体系架构202308版

1.前言 当我们不断向前奔跑时&#xff0c;需要回头压实走过的路。不断扩张的同时把相应的内容沉淀下来&#xff0c;为后续的发展铺垫基石。 不知从何时起&#xff0c;产品的架构就面向了微服务/中台化/前后端分离/低代码化/分布式/智能化/运行可观测化的综合体&#xff0c;让…

API接口用例生成器

一、前言 随着自动化测试技术的普及&#xff0c;已经有很多公司或项目&#xff0c;多多少少都会进行自动化测试。 目前本部门的自动化测试以接口自动化为主&#xff0c;接口用例采用 Excel 进行维护&#xff0c;按照既定的接口用例编写规则&#xff0c;对于功能测试人员来说只…

SQL Server数据库如何添加Oracle链接服务器(Windows系统)

SQL Server数据库如何添加Oracle链接服务器 一、在添加访问Oracle的组件1.1 下载Oracle的组件 Oracle Provider for OLE DB1.2 注册该组件1.2.1 下载的压缩包解压位置1.2.2 接着用管理员运行Cmd 此处一定要用管理员运行&#xff0c;否则会报错 二、配置环境变量三、 重启SQL Se…