【LOJ2055】【洛谷P2824】排序【线段树】【二分答案】

【SAP PO】SAP PO 接口配置完整教程之二REST服务对接 SAP PO 接口配置完整教程之二REST服务对接 阅读详情

题目大意:

题目链接:
洛谷:https://www.luogu.org/problem/P2824
LOJ:https://loj.ac/problem/2055#submit_code
给出一个 1 ∼ n 1\sim n 1∼n的排列,两个操作:

  • 0   l   r 0\ l\ r 0 l r:将 [ l , r ] [l,r] [l,r]的数字升序排列
  • 1   l   r 1\ l\ r 1 l r:将 [ l , r ] [l,r] [l,r]的数字降序排列

给出 q q q,求出最终位于数列第 q q q位的数字。


思路:

n b nb nb思路!
暴力的复杂度时 O ( n m log ⁡ n ) O(nm\log n) O(nmlogn)的,其中排序复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),如果可以有效减少排序的复杂度,就可以降低代码复杂度。
我们发现,01序列的排序可以在 O ( log ⁡ n ) O(\log n) O(logn)内完成。以升序排列为例,我们用线段树维护出区间 [ l , r ] [l,r] [l,r]数字1的个数 s u m sum sum,然后区间修改 [ l , r − s u m + 1 ] [l,r-sum+1] [l,r−sum+1]为1, [ l , l + s u m ] [l,l+sum] [l,l+sum]为0。 .
那么如何把原数列转换成01数列呢?考虑二分答案。
我们在区间 [ 1 , n ] [1,n] [1,n]内二分答案 m i d mid mid,每次把大于等于 m i d mid mid的数字变成1,小于 m i d mid mid的数字变成0,然后 O ( m log ⁡ n ) O(m\log n) O(mlogn)完成所有操作,最终如果在第 q q q为上的数字是1,那么最终答案一定大于等于 m i d mid mid,否则小于 m i d mid mid。
时间复杂度 O ( m log ⁡ 2 n ) O(m\log^2n) O(mlog2n)


代码:

#include <cstdio>
#include <string>
#define reg register
using namespace std;

const int N=100010;
int n,m,opt,l,r,mid,x,y,q,a[N],b[N];

struct Ask
{
	int l,r,opt;
}ask[N];

struct Tree
{
	int l,r,lazy,sum;
}tree[N*4];

int read()
{
	int d=0;
	char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch))
		d=(d<<3)+(d<<1)+ch-48,ch=getchar();
	return d;
}

void build(int x)
{
	tree[x].lazy=-1; tree[x].sum=0;
	if (tree[x].l==tree[x].r)
	{
		tree[x].sum=a[tree[x].l];
		return;
	}
	int mid=(tree[x].l+tree[x].r)>>1;
	tree[x*2].l=tree[x].l;
	tree[x*2].r=mid;
	tree[x*2+1].l=mid+1;
	tree[x*2+1].r=tree[x].r;
	build(x*2); build(x*2+1);
	tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
}

void pushdown(int x)
{
	if (tree[x].lazy!=-1)
	{
		tree[x*2].lazy=tree[x].lazy;
		tree[x*2+1].lazy=tree[x].lazy;
		tree[x*2].sum=tree[x].lazy*(tree[x*2].r-tree[x*2].l+1);
		tree[x*2+1].sum=tree[x].lazy*(tree[x*2+1].r-tree[x*2+1].l+1);
		tree[x].lazy=-1;
	}
}

int find(int x,int l,int r)
{
	if (l>r) return 0;
	if (tree[x].l==l && tree[x].r==r)
		return tree[x].sum;
	pushdown(x);
	int mid=(tree[x].l+tree[x].r)>>1;
	if (r<=mid) return find(x*2,l,r);
	if (l>mid) return find(x*2+1,l,r);
	return find(x*2,l,mid)+find(x*2+1,mid+1,r);
}

void change(int x,int l,int r,int val)
{
	if (l>r) return;
	if (tree[x].l==l && tree[x].r==r)
	{
		tree[x].sum=val*(tree[x].r-tree[x].l+1);
		tree[x].lazy=val;
		return;
	}
	pushdown(x);
	int mid=(tree[x].l+tree[x].r)>>1;
	if (r<=mid) change(x*2,l,r,val);
	else if (l>mid) change(x*2+1,l,r,val);
	else change(x*2,l,mid,val),change(x*2+1,mid+1,r,val);
	tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
}

int main()
{
	n=read(); m=read();
	for (reg int i=1;i<=n;i++)
		b[i]=read();
	for (reg int i=1;i<=m;i++)
		ask[i].opt=read(),ask[i].l=read(),ask[i].r=read();
	q=read();
	l=1; r=n;
	while (l<=r)
	{
		mid=(l+r)>>1;
		for (reg int i=1;i<=n;i++)
			if (b[i]<mid) a[i]=0;
				else a[i]=1;
		tree[1].l=1; tree[1].r=n;
		build(1);
		for (reg int i=1;i<=m;i++)
		{
			int sum=find(1,ask[i].l,ask[i].r);
			if (!ask[i].opt)
			{
				change(1,ask[i].l,ask[i].r-sum,0);
				change(1,ask[i].r-sum+1,ask[i].r,1);
			}
			else
			{
				change(1,ask[i].l,ask[i].l+sum-1,1);
				change(1,ask[i].l+sum,ask[i].r,0);
			}
		}
		if (find(1,q,q)==1) l=mid+1;
			else r=mid-1;
	}
	printf("%d\n",l-1);
	return 0;
}
STM32F4XX软件模拟I2C实现MPU6050姿态数据采集 本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。 阅读详情

相关推荐

Xilinx GTY Transceiver时钟方案与功耗优化实践

本文详细解析了Xilinx GTY Transceiver的时钟方案设计与功耗优化实践,涵盖从基础配置到高速24.33024Gbps和中速10.1376Gbps的实战案例。通过Transceivers Wizard的IP设计技巧和动态功耗优化方法,帮助工程师有效降低FPGA系统功耗,提升高速串行通信的稳定性与效率。

weixin_28736355的博客 228

【算法】二分答案 洛谷 LeetCode

总结 【参考:我写了首诗,让你闭着眼睛也能写对二分搜索 :: labuladong的算法小抄】 有序数组 nums = [1,2,2,2,3],target 为 2,此算法返回的索引是 2,没错。但是如果我想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 3, 中间的 int binary_search(int[] nums, int target) { int left = 0, right = nums.length - 1; while(l

myaijarvis notebook 856

HexView 脚本自动化工具:从刷写文件处理到批量转换实战

本文详细介绍了如何利用HexView脚本自动化工具高效处理嵌入式刷写文件。通过实战演示,文章展示了如何使用bat脚本实现S19、HEX等格式文件的剪切、填充、合并与批量转换,构建自动化流水线,从而显著提升汽车电子等领域的开发与生产效率。

weixin_29237635的博客 356

1584 ZJOI2008 骑士(Bzoj1040 LOJ10162 LUOGU2607 省选/NOI-) 枚举组合数30分 类01背包树上DP10分 基环树有向图(强制不选某点正确性证明)100分

总目录 在线测评地址(ybt) 在线测评地址(LOJ) 在线测评地址(LUOGU)

mrcrack的博客 400

PX4/ArduPilot源码克隆提速秘籍:国内镜像与子模块优化全攻略

本文详细介绍了PX4/ArduPilot源码克隆的提速秘籍,包括使用国内镜像源和子模块优化技巧。通过阿木实验室、华为云等国内镜像,克隆速度可提升20倍,同时提供子模块替换和并行编译等实用方法,大幅提升开发效率。

weixin_29251567的博客 523

3D Slicer + MONAI Bundle实战:如何用Wholebrainseg模型快速分割133个脑区(附避坑指南)

本文详细介绍了如何利用MONAI Model Zoo中的Wholebrainseg模型,在3D Slicer环境中高效分割133个脑区。文章重点提供了数据预处理、GPU推理加速及结果精修等实战技巧与避坑指南,旨在帮助医学影像研究者和开发者提升全脑分割的精度与效率。

310

【LOJ 2392】「JOISC 2017 Day 1」烟花棒(二分答案,贪心)

目录题目题目描述输入格式输出格式样例数据范围与提示思路代码 题目 题目描述 题目传送门 题目译自 JOISC 2017 Day1 T3「手持ち花火 / Sparklers」 有 NNN 人站在一条数轴上。他们人手一个烟花,每人手中的烟花都恰好能燃烧 TTT 秒。每个烟花只能被点燃一次。 111 号站在原点,iii 号 (1≤i≤n)(1\leq i\leq n)(1≤i≤n) 到 111 号的距离为 。保证 X1=0X_1 = 0X1​=0,X1,X2,...,XNX_1,X_2,...,X_NX1​,X2

t14 的博客 1663

实测有效!易灵思FPGA工程如何正确配置Efinity+Modelsim仿真环境

本文详细介绍了易灵思FPGA工程中如何高效配置Efinity与Modelsim联合仿真环境,包括软件版本匹配、系统环境变量设置、工程文件结构优化及仿真脚本深度优化等实战经验。通过实测数据验证,该方案可显著提升仿真效率,适用于不同规模的设计验证,帮助工程师快速搭建稳定高效的联仿环境。

m2n3b4v5c6的博客 404

洛谷——P2824 排序

HEOI2016/TJOI2016] 排序 - 洛谷。

m0_72579201的博客 916

【智驾与大模型】端到端与多模态大模型的精彩之旅

智驾和大模型的回顾与展望。开头的笔者自述也说了些心窝子话,边缘计算的监管刻不容缓!

仿生实验室:从0到1,制作人脸表情交互机器人,记录过程,软硬件全部开源,与君共襄盛举! 1318

BraTS数据集保姆级使用指南:从下载、预处理到可视化(附Python脚本)

本文提供BraTS数据集的完整使用指南,涵盖从下载、预处理到可视化的全流程,并附有Python脚本示例。详细解析了医学影像处理中的数据结构、标准化流程和可视化技巧,帮助初学者快速掌握BraTS数据集的应用方法,提升医学影像分析效率。

weixin_27310417的博客 461

LOJ2452

LOJ2452 一眼看去,有点像LOJ2427,然后。。那是想多了 好像没有什么好办法 仔细分析一下: 首先显然只有偶数串才能成功 而且假如[L,R][L,R][L,R]成功了,则[L+1,R−1][L+1,R−1][L+1,R-1]一定成功 这样不就可以hash+二分枚举了吗? #include&lt;bits/stdc++.h&gt; #define gt() (p1==p2&...

ff_666的博客 486

手把手教你学基于 Linux 的 NPU 固件开发-第 10 讲:可靠性设计(RAS)——让系统坚如磐石错误检测、纠正与上报机制(ECC、Parity)

组件推荐保护机制备注HBM/DDRScrubbing必须开启,定期巡检片上 SRAMECC(权重/激活值),Parity(指令)权衡面积与可靠性计算单元ABFT或DMR(关键路径)防止计算逻辑错误片上网络CRC重传保证数据传输完整性系统软件AER 上报CE 监控自动恢复闭环管理,杜绝 SDC运维策略预测性维护Checkpoint变被动为主动核心心法(信任硬件,但必须验证。在纳米尺度下,错误是必然发生的物理现象。

MHD0815的博客 90

【JLOI】01新年首讲-二分答案

【JLOI】01 新年首讲,不是吗? 二分答案! CCF NOIP 普及组基础知识 接下来我们将用2节课时间来讲一下二分以及二分答案 【引入例题】 给定一个长度为n的序列,保证是从小到大排的。有m次询问,每次询问数组中x第一次出现的位置。如果没有出现x就输出-1 n、m&lt;=100000 【思路】 普通做法 无脑n×m模拟,时间复杂度O(nm),0分 高级做法 二分答案 首先二分是有局限性的:...

weixin_43872370的博客 248

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[贪心 DP] BZOJ 4069 [Apio2015]巴厘岛的雕塑

从高位到低位 题目里面数据分两类 一类是A>1,dp一下f[i][j]这段区间是否符合当前答案,n3log; 第二类是A=1,dp一下g[i]表示在满足答案前提下以i为结尾切开来最少能且多少段,n2log。 #include #include #include using namespace std; typedef long long ll; inline char nc(

雯舞 664

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

[LOJ2274][JXOI2017]加法 二分答案+优先队列

大概思路就是:先二分答案xx,check就是从左往右扫,如果当前值不足xx,就贪心地不断选右端点最右的给它加上,然后用线段树\树状数组维护区间加,或者直接用优先队列维护加的次数即可。 具体地,开两个优先队列Q,HQ,H,前者维护当前可选区间的右端点最大值,后者维护当前已选区间左端点最小值,然后从左往右扫到ii: 1. 把左端点位于ii的区间加入QQ。 2. 把左端点小于ii的从HH里扔掉。

DOFYPXY的博客 969

洛谷P2824:[HEOI2016]排序 (二分答案+线段树)

题目传送门:https://www.luogu.org/problemnew/show/P2824题目分析:这题是我上生物课的时候花20分钟想到的。我们可以像整体二分那样,先枚举一个数作为标准,然后只关心a序列中的每个数比这个标准大还是小,小于等于记为0,大于记为1。假设某一次操作要让一个区间升序排序,我们就用线段树先查一下这个区间有几个0和1,然后用懒惰操作将0放在区间左边,1放在区间右边。降序排

KsCla 646

【CSP-S 2019】【洛谷P5658】括号树【dfs】【二分】

入门组选手承受范围之内233

stoorz 647

【牛客练习赛46-A】华华教奕奕写几何【二分】

题目大意: 题目链接:https://ac.nowcoder.com/acm/contest/894/A 给出红色部分面积,求大圆的最短直径(两小圆直径之和等于大圆直径)。 思路: orz WYC,XYYdalaoorz\ WYC,XYY dalaoorz WYC,XYYdalao反正我是没有看出开个根号就好了。 先把问题转化为圆中的问题。 此时红色部分面积就为2s2s2...

stoorz 487

【洛谷P4343】自动刷题机【二分答案】

题目大意: 题目链接:https://www.luogu.org/problem/P4343 曾经发明了信号增幅仪的发明家 SHTSC 又公开了他的新发明:自动刷题机——一种可以自动 AC 题目的神秘装置。 自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序。每秒,自动刷题机的代码生成模块会有两种可能的结果: 写了xxx行代码 心情不好,删掉了之前写的yyy行代码。...

stoorz 454

【洛谷P1462】通往奥格瑞玛的道路【二分】【最短路】

题目大意: 题目链接:https://www.luogu.org/problemnew/show/P1462 给出一张无向图,每个点和边都有权值。求从111到nnn的所有路径中,在边权不超过bbb的情况下点权的最大值最小。 思路: 这道题很明显是要二分答案的。因为要使最大的点权尽量小,所以就二分这个最大的点权midmidmid,然后跑SPFASPFASPFA,要求路径上的点的权值都不能超过mid...

stoorz 417

Best Cow Fences【二分】

题目大意: 给出一个数列,求长度超过LLL的平均值最大的子串。 思路: 考虑二分答案,将a[i]a[i]a[i]全部减去ansansans,那么题目转化为“求长度超过LLL的和为正数的子串”。 注意误差! 代码: #include &amp;lt;cstdio&amp;gt; #include &amp;lt;iostream&amp;gt; #include &amp;lt;cmath&a

stoorz 416

【JZOJ3337】wyl8899的TLE【二分】【哈希】

题目大意: 题目链接:https://jzoj.net/senior/#main/show/3337 给出两个字符串a,ba,ba,b,在aaa中改不超过一个字符,求这个新串的前缀为bbb的字串的最大前缀。 思路: 考虑暴力如何搞定这道题。枚举aaa串在bbb串中的位置,然后暴力往后判断修改不超过一个字符的最大前缀长度。时间复杂度O(nm)O(nm)O(nm)。 但是我们发现前缀长度是单调的,也...

stoorz 371

【JZOJ4256】平均数【二分】

题目大意: 题目链接:https://jzoj.net/senior/#main/show/4256 给出包含一个NNN个整数的数组AAA。找出一段长度至少为mmm的连续序列,最大化它的平均值。 思路: 很明显这道题的答案满足单调性。若可以找出一段区间的平均值超过kkk,那么必然可以找到一段区间的平均值超过k−1k-1k−1。 那么可以考虑二分答案。 设二分的答案为ansansans 若 (∑i...

stoorz 361

【洛谷P3554】LUK-Triumphal arch【树形dp】【二分】

题目大意: 题目链接:https://www.luogu.org/problemnew/show/P3554 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜。求能让A获胜的最小的k。 思路: 这个kkk比较恶心,可以二分答案使题目变成一个判定性问题。 若midmidmid为...

stoorz 330

【洛谷P2801】教主的魔法【分块】【二分】

题目大意: 题目链接:https://www.luogu.org/problemnew/show/P2801 给出一串数列,有两个操作: M&amp;amp;nbsp;x&amp;amp;nbsp;y&amp;amp;nbsp;z:M\ x\ y\ z:M&amp;amp;nbsp;x&amp;amp;nbsp;y&amp;amp;nbsp;z:将位置在xxx到yyy之间的数全部加上zzz A&amp;amp;nbsp;x&amp;

stoorz 329

【JZOJ3833】平坦的折线【dp】【二分】

题目大意: 题目链接:https://jzoj.net/senior/#main/show/3833 现在我们在一张纸上有一个笛卡尔坐标系。我们考虑在这张纸上用铅笔从左到右画的折线。我们要求任何两个点之间连接的直线段与x轴的夹角在-45~45之间,一条满足以上条件的折线称之为平坦的折线。假定给出了n个不同的整点(坐标为整数的点),最少用几条平坦的折线可以覆盖所有的点? 例子: 图中有6个整点:(...

stoorz 321
上一篇: 【Comet OJ - Contest #8】C - 符文能量【dp】
下一篇: 【CF17D】Notepad【拓展欧拉定理】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值