题意:给一个序列,这个序列的长度是
n
n
n,现在想要把序列分段,每一小段里面排列,使总体的序列是非递减排列,打印最多可以分成多少段。
思路:
我们要看一个数后面最小的数是谁,也就是后缀数组存一下
然后比较当前点的数字
b
i
b_i
bi是否大于
m
a
x
x
maxx
maxx,如果大于的话
a
n
s
+
+
ans++
ans++.
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N], b[N], n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
int minn = a[n];
for (int i = n; i >= 1; i -- ){
minn = min(minn, a[i]);
b[i] = minn;
}
int ans = 0, maxx = 0;
for (int i = 1; i <= n; i ++ ){
if (maxx <= b[i]) ans ++;
maxx = max(maxx, a[i]);
}
cout << ans << endl;
return 0;
}