#include<iostream>#include<algorithm>#include<cstring>#include<queue>#definedebug(a) cout << #a <<" = "<< a << endl;#definexfirst#defineysecondusingnamespace std;typedeflonglong ll;constint N =1e6+10;int n;int a[N];int maxx[N], minn[N];intmain(){ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _ =1;// cin >> _;while(_ --){cin >> n;for(int i =1; i <= n; i ++) cin >> a[i];maxx[0]=0;minn[n +1]=1e9+7;for(int i =1; i <= n; i ++)maxx[i]=max(maxx[i -1], a[i]);for(int i = n; i >=1; i --)minn[i]=min(minn[i +1], a[i]);int ans =0;for(int i =1; i <= n; i ++)if(maxx[i]<= minn[i +1])ans ++;cout << ans << endl;}return0;}
附上另一種方案,只記錄后綴的,且不增加哨兵
#include<iostream>#include<algorithm>#include<cstring>#include<queue>#definedebug(a) cout << #a <<" = "<< a << endl;#definexfirst#defineysecondusingnamespace std;typedeflonglong ll;constint N =1e6+10;int n;int a[N];int maxx[N], minn[N];intmain(){ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _ =1;// cin >> _;while(_ --){cin >> n;for(int i =1; i <= n; i ++) cin >> a[i];int mi = a[n];for(int i = n; i >=1; i --){mi =min(mi, a[i]);minn[i]= mi;}int mx =0, ans =0;for(int i =1; i <= n; i ++){if(mx <= minn[i]) ans ++;mx =max(mx, a[i]);}cout << ans << endl;}return0;}