P7714 「EZEC-10」排列排序
题目大意
给你一个序列 , 选择排列中的任意一段区间 ,求将序列 从小到大排序最少需要排序多少个数。
解题思路
每次输入一个数 ,将其与当前遍历的编号 求最大和最小值。
再用一个差分数组,将区间 整体加 ,说明这个区间需要排序。
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;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122165