#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
#define pii pair<int,int>
#define vii vector<pair<int,int>>
#define vi vector<int>
#define pll pair<ll, ll>
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define count_bits(x) __builtin_popcountll((x))
const ll M = 1e9+7;
const ll INF = 1e9;
//mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll los(ll a, ll b) {return a + (mt() % (b-a+1));}
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
const int MAXN = 1e6 + 5;
int A[MAXN];
int praw[MAXN];
stack<pii> W;
stack<pii> S;
vi K;
stack<pii> TMP;
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(int i = 1; i <= n; ++i){
cin >> A[i];
}
for(int i = 1; i <= n; ++i){
while(S.size() > 0 and S.top().first < A[i]){
S.pop();
}
S.push({A[i], i});
}
int ans = 0;
while(S.size() > 0){
K.push_back(S.top().second);
S.pop();
}
reverse(all(K));
int ind = K[0];
praw[ind] = 1;
W.push({A[ind], ind});
for(int i = ind-1; i > 0; --i){
while(W.size()>0 and W.top().first <= A[i]){
W.pop();
}
praw[i] = praw[W.top().second] + 1;
W.push({A[i], i});
}
while(W.size() > 0){
TMP.push(W.top());
W.pop();
}
W = TMP;
auto czysc = [&] () -> void{
while(S.size() > 0) S.pop();
};
int bonus = 0;
for(int i = 1; i < K.size(); ++i){
int start = K[i];
while(W.size() > 0 and W.top().first > A[start]){
bonus++;
W.pop();
}
praw[start] = 1;
S.push({A[start], start});
for(int j = start - 1; j > K[i-1]; --j){
while(S.size() > 0 and S.top().first <= A[j]){
S.pop();
}
praw[j] = praw[S.top().second] + 1;
S.push({A[j], j});
}
czysc();
for(int j = K[i-1] + 1; j <= start; ++j){
praw[j] += bonus;
}
}
for(int i = 1; i <= n; ++i){
ans = max(ans, praw[i]);
}
cout << ans << "\n";
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; #define pii pair<int,int> #define vii vector<pair<int,int>> #define vi vector<int> #define pll pair<ll, ll> #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define count_bits(x) __builtin_popcountll((x)) const ll M = 1e9+7; const ll INF = 1e9; //mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll los(ll a, ll b) {return a + (mt() % (b-a+1));} typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; const int MAXN = 1e6 + 5; int A[MAXN]; int praw[MAXN]; stack<pii> W; stack<pii> S; vi K; stack<pii> TMP; int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for(int i = 1; i <= n; ++i){ cin >> A[i]; } for(int i = 1; i <= n; ++i){ while(S.size() > 0 and S.top().first < A[i]){ S.pop(); } S.push({A[i], i}); } int ans = 0; while(S.size() > 0){ K.push_back(S.top().second); S.pop(); } reverse(all(K)); int ind = K[0]; praw[ind] = 1; W.push({A[ind], ind}); for(int i = ind-1; i > 0; --i){ while(W.size()>0 and W.top().first <= A[i]){ W.pop(); } praw[i] = praw[W.top().second] + 1; W.push({A[i], i}); } while(W.size() > 0){ TMP.push(W.top()); W.pop(); } W = TMP; auto czysc = [&] () -> void{ while(S.size() > 0) S.pop(); }; int bonus = 0; for(int i = 1; i < K.size(); ++i){ int start = K[i]; while(W.size() > 0 and W.top().first > A[start]){ bonus++; W.pop(); } praw[start] = 1; S.push({A[start], start}); for(int j = start - 1; j > K[i-1]; --j){ while(S.size() > 0 and S.top().first <= A[j]){ S.pop(); } praw[j] = praw[S.top().second] + 1; S.push({A[j], j}); } czysc(); for(int j = K[i-1] + 1; j <= start; ++j){ praw[j] += bonus; } } for(int i = 1; i <= n; ++i){ ans = max(ans, praw[i]); } cout << ans << "\n"; return 0; } |
English