题解 | #随机序列#

齐齐排序

https://ac.nowcoder.com/acm/problem/21439

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#define fi first
#define se second

using namespace std;

const int N = 2e5 + 10;

int a[N];
int x[N], t[N];
vector<pair<int, int>> st;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int n, m; cin >> n >> m;
	for(int i = 1; i <= n; i++) cin >> a[i];
	for(int i = 1; i <= m; i++) cin >> t[i] >> x[i];
	
	int mx = 0;
	// 对于数组a, [1, x[maxi]] 排序完之后,得再排序 [1, x[se-maxi]], 然后再排 [1, x[th-maxi]],以此类推。
	// 会发现从前往后找,对于数组x, 要先遍历区间[1, m], 找到 max,再记录下 maxi,再将 mx 归 0。然后再遍历区间[maxi + 1, m],再找一个最大值 se-max,再把下标 se-maxi 记录下来,然后再遍历[se-maxi + 1, m], 一直不断遍历下去,有点像归并排序只处理右孩子区间一样,时间复杂度肯定超 O(N)了。
	// 但从后往前找,对于数组x,mx 就不用归 0, 找的时候,先把 x[m]赋给 mx, (a[x[m]]在后续操作中会在最后一次排序操作中被单独排序),再把 x[m] 记录下来,往前遍历,如果x[i] <= mx, 说明在数组a中[1, x[i]]的元素排序操作会被 sort(a + 1, a + mx + 1) 或 sort(a + 1, a + mx + 1, greater<int>()) 覆盖掉;如果 x[i] > mx,说明在数组a中[1, x[i]]包括的元素要比[1, mx]还要多,记录下来,放到倒数第二次排序,继续往前遍历。只需遍历一遍,就把需要排序的区间给倒着存好了,时间复杂度为 O(N)。
	for(int i = m; i >= 1; i--) {
		if(mx < x[i]) {
			st.push_back({t[i], x[i]});
			mx = x[i];
		}
	}
	
	for(int i = st.size() - 1; i >= 0; i--) {
		int t = st[i].fi, x = st[i].se;
		if(t == 1) sort(a + 1, a + x + 1);
		else sort(a + 1, a + x + 1, greater<int>());
	}
	
	for(int i = 1; i <= n; i++) cout << a[i] << " ";
	
	return 0;
}
// 附:x[maxi]为数组x在[1, m]范围内元素最大值,x[se-maxi]为数组x在[maxi + 1, m]元素最大值,x[th-maxi]为数组x在[se-maxi, m]元素最大值,以此类推。
全部评论

相关推荐

头像
05-16 12:47
已编辑
中国地质大学(武汉) Java
你出生在农村,与其它农村小孩子无异小学时你对成绩没有概念,只感觉上课不听课也是无聊,只知道不写完作业会被老师罚站一到考试,自己成绩总是名列靠前,即使偶尔落后,你也从不在意中学时你觉得课本的东西很简单,随便学学就会了,并没有大量刷题你总是想不通,那些所谓的数学物理中难题,明明是在送分,为什么你的同学总是想不出解题方法高中时这三年你过的不容易,晚睡早起,给了自己很多压力.但是你也发现自己是有些小聪明的,你感觉班里有些同学很刻苦,但成绩比你差远了。那些数学题和物理题的陷阱,同学一遍遍踩坑,但是你总能发现并避开它们.“为了父母的期盼,为了恩师的厚望,为了天赐的智慧,为了青春的理想......”“天行健...
创作助手_刘北:其实,这种已经是神童级别的了,不费吹灰之力就能拿到自己想要的东西,就像机器按照程序走了一遍,就像我小时候看爱情公寓,觉得他们都很惨,几个人只能挤在一个房间里合租,但是好在他们有一群非常好的朋友,随着时间的推移,慢慢长大了,在看爱情公寓的时候,觉得他们都很厉害,博士、留学生、***、电台公子,数学天才,任何一个都是我可望而不可即的,更别说可以在异地认识一群更好的朋友了,所以呢,人还是要自给自足,满足当下,不要攀比,意气风发的且有理想的18岁少年永远都存在,只不过随着时间的推移他被你包裹在了洋葱的最深处。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务