#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<int> b(2 * n);
for (int i = 0; i < 2 * n; ++i) {
b[i] = a[i % n];
}
vector<int> prev(2 * n, -1);
stack<int> st;
for (int i = 0; i < 2 * n; ++i) {
while (!st.empty() && b[st.top()] < b[i]) {
st.pop();
}
if (!st.empty()) {
prev[i] = st.top();
}
st.push(i);
}
vector<int> diff(n + 1, 0);
for (int i = 0; i < 2 * n; ++i) {
int L = max({ 0, i - n + 1, prev[i] + 1 });
int R = min(i, n - 1);
if (L <= R) {
diff[L]++;
if (R + 1 < n) {
diff[R + 1]--;
}
}
}
int ans = 0;
int cur = 0;
for (int s = 0; s < n; ++s) {
cur += diff[s];
ans = max(ans, cur);
}
cout << ans;
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 | #include <iostream> #include <vector> #include <stack> #include <algorithm> using namespace std; int main() { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } vector<int> b(2 * n); for (int i = 0; i < 2 * n; ++i) { b[i] = a[i % n]; } vector<int> prev(2 * n, -1); stack<int> st; for (int i = 0; i < 2 * n; ++i) { while (!st.empty() && b[st.top()] < b[i]) { st.pop(); } if (!st.empty()) { prev[i] = st.top(); } st.push(i); } vector<int> diff(n + 1, 0); for (int i = 0; i < 2 * n; ++i) { int L = max({ 0, i - n + 1, prev[i] + 1 }); int R = min(i, n - 1); if (L <= R) { diff[L]++; if (R + 1 < n) { diff[R + 1]--; } } } int ans = 0; int cur = 0; for (int s = 0; s < n; ++s) { cur += diff[s]; ans = max(ans, cur); } cout << ans; return 0; } |
English