P7714 「EZEC-10」排列排序

题目大意

给你一个序列 aa , 选择排列中的任意一段区间 [l,r][l,r],求将序列 aa 从小到大排序最少需要排序多少个数。

解题思路

每次输入一个数 xx ,将其与当前遍历的编号 ii 求最大和最小值。

再用一个差分数组,将区间 [mmin,mmax][mmin,mmax] 整体加 11,说明这个区间需要排序。

AC CODE

#include <bits/stdc++.h>
#define max(a,b) a > b ? a : b
#define min(a,b) a > b ? b : a
#define int long long
using namespace std;

int T, n, ans;
int a[200010];

int maxn, minn;

signed main()
{
	cin >> T;
	while(T--)
	{
		cin >> n;
		maxn = 0;
		minn = INT_MAX;
		for(int i = 1;i <= n;i++) a[i] = 0;
		for(int i = 1;i <= n;++i)
		{
			int x;
			cin >> x;
			if(x == i) continue;
			minn = min(i,x);
			maxn = max(i,x);
			a[minn]++;
			a[maxn + 1]--;
		}
		ans = 0;
		for(int i = 1;i <= n;++i)
		{
			a[i] += a[i - 1];
			if(a[i]) ans++;
		}
		cout << ans << endl;
	}
	return 0;
}
posted @ 2021-07-12 16:20  蒟蒻orz  阅读(5)  评论(0编辑  收藏  举报  来源