来了宝贝,今天又是写题解的一天。
经过上次本蒟蒻考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;
}
轻松打压!
后续(题解写的不过瘾):上一篇题解,是因为我的∠受伤了,现在我的∠好了,手又受伤了!
啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
发泄完毕。
B4041区间排序题解:sort使用技巧
838

被折叠的 条评论
为什么被折叠?



