B4041 [GESP202409 四级] 区间排序 题解

B4041区间排序题解:sort使用技巧

来了宝贝,今天又是写题解的一天。

经过上次本蒟蒻考GESP四级59分,我彻底老实了。于是,我决定切一道水题。

题目传送门:B4041 [GESP202409 四级] 区间排序

题目描述

小杨有一个包含 n 个正整数的序列 a。

小杨计划对序列进行多次升序排序,每次升序排序小杨会选择一个区间 [l,r](l≤r)并对区间内所有数字,即进行升序 al​,al+1​,…ar​ 排序。每次升序排序会在上一次升序排序的结果上进行。

小杨想请你计算出多次升序排序后的序列。

输入格式

第一行包含一个正整数 n,含义如题面所示。
第二行包含 n 个正整数 a1​,a2​,…an​,代表序列 a。
第三行包含一个正整数 q,代表排序次数。
之后 q 行,每行包含两个正整数 l,r,代表将区间 [li​,ri​] 内所有数字进行升序排序。

输出格式

输出一行包含 n 个正整数,代表多次升序排序后的序列。

输入输出样例

输入 #1复制

5
3 4 5 2 1
3
4 5
3 4
1 3

输出 #1复制

1 3 4 5 2

说明/提示

样例 1 解释

  • 第一次升序排序后,序列为 [3,4,5,1,2];
  • 第二次升序排序后,序列为 [3,4,1,5,2];
  • 第三次升序排序后,序列为 [1,3,4,5,2];

数据规模与约定

对于全部的测试数据,保证 1≤n,ai​,q≤100,1≤li​≤ri​≤n。

看完题目,我的第一反应就是用sort。至于sort是个什么东西我这里就不多说了。

sort详解传送门:sort详解

当然,sort也很好用,每次输入两个数,就sort一次,这样我们就不用手搓排序了(当然喜欢手搓的宝子们也可以手搓)。但是,用sort的话,会有一个小坑,就是你要知道sort的开始位置和结束位置,搞清楚这点,你就可以AC了。

有些宝子们不知道怎么用sort,下面我给出sort排序代码(错误):

sort(a+l,a+r);

但是测了样例之后,你就会发现样例不对。为什么呢?

大家仔细想想,我们的a数组是从1开始的,如果按照此代码运行,输入的l和r分别为2和4,程序就会:

从2(0+2)开始进行区间排序,直到4(0+4)为止结束排序。看着好像没有什么问题,实际上代码是从2开始排序,到3停止,因为这样写程序会认为是<4,应为<=4,所以不对。写成for循环大家可能更好理解:

for(int i=2;i<4;i++){
    //阿巴阿巴阿巴……
}

也可以写成:

for(int i=2;i<=3;i++){
    //阿巴阿巴阿巴……
}

怎么改呢?

很简单,要想排到4,+1就行了,就这么简单。

所以,AC代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin>>n;
	int a[n+5];
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int q;
	cin>>q;
	int l,r;
	while(q--){
		cin>>l>>r;
		sort(a+l,a+r+1);
	}
	for(int i=1;i<=n;i++){
		cout<<a[i]<<' ';
	}
	return 0;
}

轻松打压!

后续(题解写的不过瘾):上一篇题解,是因为我的∠受伤了,现在我的∠好了,手又受伤了!

啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

发泄完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值