这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
小思老师现在拿到了一个数字序列,
这个数字序列恰好由1到n这n个数字组成,
但这些数字可能没有排序。
由于小思老师平时工作比较忙,
她每次只能针对这n个数的一个子区间进行排序,
比如:给定一个区间[l, r],将这个区间从小到大排序,需要花费r-l+1个精力。
现在小思老师可以执行若干次这样的操作,
直到这个序列中所有的数字从1到n升序排列。
小思老师想知道,她需要花费的精力最少是多少?
本题有多组询问,第一行有一个数T表示询问组数。
对于每组询问:
第一行给出一个整数n
第二行n个整数,由空格隔开,代表待排序的序列。
T行,每行一个整数表示一组询问的答案。
- 2
- 3
- 1 3 2
- 4
- 3 2 1 4
- 2
- 3
对于30%的数据,T组中所有n的累加和 <= 5000
对于100%的数据,T组中所有n的累加和 <= 100000 1<=T<=100000
本题线下文件测评时的说明:
- 可执行文件名:sort
- 提交源程序文件名:sort.cpp
- 输入文件名:sort.in
- 输出文件名:sort.out
- 时间限制:1秒
- 空间限制:256MB
- #include
- 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++;
- }
-