前言:
这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
题目描述
小思老师现在拿到了一个数字序列,
这个数字序列恰好由1到n这n个数字组成,
但这些数字可能没有排序。
由于小思老师平时工作比较忙,
她每次只能针对这n个数的一个子区间进行排序,
比如:给定一个区间[l, r],将这个区间从小到大排序,需要花费r-l+1个精力。
现在小思老师可以执行若干次这样的操作,
直到这个序列中所有的数字从1到n升序排列。
小思老师想知道,她需要花费的精力最少是多少?
输入描述
本题有多组询问,第一行有一个数T表示询问组数。
对于每组询问:
第一行给出一个整数n
第二行n个整数,由空格隔开,代表待排序的序列。
输出描述
T行,每行一个整数表示一组询问的答案。
输入样例#1
2
3
1 3 2
4
3 2 1 4
输出样例#1
2
3
提示
对于30%的数据,T组中所有n的累加和 <= 5000
对于100%的数据,T组中所有n的累加和 <= 100000 1<=T<=100000
本题线下文件测评时的说明:
- 可执行文件名:sort
- 提交源程序文件名:sort.cpp
- 输入文件名:sort.in
- 输出文件名:sort.out
- 时间限制:1秒
- 空间限制:256MB
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N],b[N];
int n;
int main()
{
//freopen("sort.in","r",stdin);
//freopen("sort.out","w",stdout);
int t;
cin>>t;
while(t--)
{
memset(b,0,sizeof(b));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(a[i]>i)
{
b[i]++;
b[a[i]+1]--;
}
}
for(int i=1;i<=n;i++)
{
a[i]=a[i-1]+b[i];
if(a[i]) ans++;
}
cout<<ans<<endl;
}
return 0;
}