题目大意
给你一个序列 a a a , 选择排列中的任意一段区间 [ l , r ] [l,r] [l,r],求将序列 a a a 从小到大排序最少需要排序多少个数。
解题思路
每次输入一个数 x x x ,将其与当前遍历的编号 i i i 求最大和最小值。
再用一个差分数组,将区间 [ m m i n , m m a x ] [mmin,mmax] [mmin,mmax] 整体加 1 1 1,说明这个区间需要排序。
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;
}