#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define sn second
#ifdef DEBUG
template<typename T>
void debug_vec(const string& name, const vector<T>& v) {
cout << name << endl;
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
}
#define DBG_VEC(v) debug_vec(#v, v)
#else
#define DBG_VEC(v)
#endif
typedef long long ll;
typedef vector<int> VI;
typedef vector<char> VC;
typedef pair<int, int> PI;
int main() {
int n;
cin >> n;
int N = 2 * n;
VI A(N);
VI next_idx(N, -1);
VI jumps(N, 0);
for (int i = 0; i < n; i++) {
cin >> A[i];
A[i + n] = A[i];
}
stack<int> S;
for (int i = N - 1; i >= 0; i--) {
while (!S.empty() && A[S.top()] <= A[i]) {
S.pop();
}
if (!S.empty()) {
next_idx[i] = S.top();
jumps[i] = jumps[next_idx[i]] + 1;
}
S.push(i);
}
DBG_VEC(A);
DBG_VEC(next_idx);
DBG_VEC(jumps);
int res = 0;
deque<int> D;
for (int i = 0; i < N; i++) {
if (!D.empty() && D.front() <= i - n) {
D.pop_front();
}
while (!D.empty() && A[D.back()] < A[i]) {
D.pop_back();
}
D.push_back(i);
if (i >= n - 1) {
int max_idx = D.front();
res = max(res, jumps[i - n + 1] - jumps[max_idx]);
}
}
cout << res + 1 << endl;
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 | #include <bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define sn second #ifdef DEBUG template<typename T> void debug_vec(const string& name, const vector<T>& v) { cout << name << endl; for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; } cout << endl; } #define DBG_VEC(v) debug_vec(#v, v) #else #define DBG_VEC(v) #endif typedef long long ll; typedef vector<int> VI; typedef vector<char> VC; typedef pair<int, int> PI; int main() { int n; cin >> n; int N = 2 * n; VI A(N); VI next_idx(N, -1); VI jumps(N, 0); for (int i = 0; i < n; i++) { cin >> A[i]; A[i + n] = A[i]; } stack<int> S; for (int i = N - 1; i >= 0; i--) { while (!S.empty() && A[S.top()] <= A[i]) { S.pop(); } if (!S.empty()) { next_idx[i] = S.top(); jumps[i] = jumps[next_idx[i]] + 1; } S.push(i); } DBG_VEC(A); DBG_VEC(next_idx); DBG_VEC(jumps); int res = 0; deque<int> D; for (int i = 0; i < N; i++) { if (!D.empty() && D.front() <= i - n) { D.pop_front(); } while (!D.empty() && A[D.back()] < A[i]) { D.pop_back(); } D.push_back(i); if (i >= n - 1) { int max_idx = D.front(); res = max(res, jumps[i - n + 1] - jumps[max_idx]); } } cout << res + 1 << endl; return 0; } |
English