#include <cstdio>
#include <vector>
using namespace std;
int main() {
int n;
scanf("%d", &n);
vector<int> a(n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
vector<int> prev_ge(2 * n, -1);
vector<int> stk;
stk.reserve(2 * n);
for (int i = 0; i < 2 * n; i++) {
int bi = a[i % n];
while (!stk.empty() && a[stk.back() % n] < bi)
stk.pop_back();
prev_ge[i] = stk.empty() ? -1 : stk.back();
stk.push_back(i);
}
vector<int> diff(n + 1, 0);
for (int i = 0; i < 2 * n; i++) {
int lo = prev_ge[i] + 1;
if (lo < i - n + 1) lo = i - n + 1;
if (lo < 0) lo = 0;
int hi = i < n - 1 ? i : n - 1;
if (lo > hi) continue;
diff[lo]++;
diff[hi + 1]--;
}
int ans = 0, cur = 0;
for (int s = 0; s < n; s++) {
cur += diff[s];
if (cur > ans) ans = cur;
}
printf("%d\n", 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 | #include <cstdio> #include <vector> using namespace std; int main() { int n; scanf("%d", &n); vector<int> a(n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); vector<int> prev_ge(2 * n, -1); vector<int> stk; stk.reserve(2 * n); for (int i = 0; i < 2 * n; i++) { int bi = a[i % n]; while (!stk.empty() && a[stk.back() % n] < bi) stk.pop_back(); prev_ge[i] = stk.empty() ? -1 : stk.back(); stk.push_back(i); } vector<int> diff(n + 1, 0); for (int i = 0; i < 2 * n; i++) { int lo = prev_ge[i] + 1; if (lo < i - n + 1) lo = i - n + 1; if (lo < 0) lo = 0; int hi = i < n - 1 ? i : n - 1; if (lo > hi) continue; diff[lo]++; diff[hi + 1]--; } int ans = 0, cur = 0; for (int s = 0; s < n; s++) { cur += diff[s]; if (cur > ans) ans = cur; } printf("%d\n", ans); return 0; } |
English