题意:就是给你一个序列,然后你把这个序列分为几个连续的块,每个块独自排序,最多可以分几个块最后排序后整个序列是不下降的。
思路:模拟,每个块的最小值要小于前面块的最大值,对于新的一个数,如果不大于前面的最大值就和前面的合并,同时更新前面的最大值和最小值,继续往前面更新,直到满足条件。
#include<stdio.h.>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
int x[100010],mx[100010],mi[100010];
int main()
{
int n;
while(cin>>n)
{
for(int i = 1; i<=n; i++)
{
scanf("%d", &x[i]);
mx[i] = x[i];
mi[i] = x[i];
}
int ans = 1;
mx[0] = -1;
mi[0] = -1;
id[1] = 1;
for(int i = 2; i<=n; i++)
{
ans++;
mx[ans] = x[i];
mi[ans] = x[i];
while(mi[ans]<mx[ans-1])
{
if(mi[ans] < mi[ans-1])
mi[ans-1] = mi[ans];
ans--;
mx[ans] = max(mx[ans+1],mx[ans]);
}
}
cout<<ans<<endl;
}
return 0;
}