#include <bits/stdc++.h>
using namespace std;
using i64 = int64_t;
using u64 = uint64_t;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> nums(n * 2);
int maxEl = 0;
for (int i = 0; i < n; i++) {
int a;
cin >> a;
nums[i] = a;
nums[i + n] = a;
maxEl = max(maxEl, a);
}
vector<int> nge(2 * n, 2 * n);
vector<int> v;
for (int i = 0; i < 2 * n; i++) {
while (!v.empty() && nums[i] > nums[v.back()]) {
nge[v.back()] = i;
v.pop_back();
}
v.push_back(i);
}
vector<int> d(n * 2);
for (int i = (n * 2) - 1; i >= 0; i--) {
if (nums[i] == maxEl) {
d[i] = 1;
} else if (nums[i] < maxEl) {
if (nge[i] < 2 * n && nge[i] < i + n) {
d[i] = 1 + d[nge[i]];
} else {
d[i] = 1;
}
}
}
int ans = *max_element(d.begin(), d.end());
cout << ans << "\n";
}
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 | #include <bits/stdc++.h> using namespace std; using i64 = int64_t; using u64 = uint64_t; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> nums(n * 2); int maxEl = 0; for (int i = 0; i < n; i++) { int a; cin >> a; nums[i] = a; nums[i + n] = a; maxEl = max(maxEl, a); } vector<int> nge(2 * n, 2 * n); vector<int> v; for (int i = 0; i < 2 * n; i++) { while (!v.empty() && nums[i] > nums[v.back()]) { nge[v.back()] = i; v.pop_back(); } v.push_back(i); } vector<int> d(n * 2); for (int i = (n * 2) - 1; i >= 0; i--) { if (nums[i] == maxEl) { d[i] = 1; } else if (nums[i] < maxEl) { if (nge[i] < 2 * n && nge[i] < i + n) { d[i] = 1 + d[nge[i]]; } else { d[i] = 1; } } } int ans = *max_element(d.begin(), d.end()); cout << ans << "\n"; } |
English