#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int n;
cin >> n;
vector<int> a(n);
int mx = 0;
for (int i = 0; i < n; ++i) {
cin >> a[i];
mx = max(mx, a[i]);
}
vector<int> nxt(n, -1);
vector<int> st;
st.reserve(n);
for (int i = 0; i < 2 * n; ++i) {
int idx = (i < n ? i : i - n);
while (!st.empty() && a[st.back()] < a[idx]) {
nxt[st.back()] = idx;
st.pop_back();
}
if (i < n)
st.push_back(i);
}
vector<int> poz(mx + 1, -1), pop(n, -1);
for (int i = 0; i < n; ++i) {
pop[i] = poz[a[i]];
poz[a[i]] = i;
}
vector<int> dp(n, 1);
int wynik = 1;
for (int v = mx; v >= 1; --v) {
for (int i = poz[v]; i != -1; i = pop[i]) {
if (nxt[i] == -1)
dp[i] = 1;
else
dp[i] = 1 + dp[nxt[i]];
wynik = max(wynik, dp[i]);
}
}
cout << wynik << '\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 50 51 52 53 54 | #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0), cin.tie(0); int n; cin >> n; vector<int> a(n); int mx = 0; for (int i = 0; i < n; ++i) { cin >> a[i]; mx = max(mx, a[i]); } vector<int> nxt(n, -1); vector<int> st; st.reserve(n); for (int i = 0; i < 2 * n; ++i) { int idx = (i < n ? i : i - n); while (!st.empty() && a[st.back()] < a[idx]) { nxt[st.back()] = idx; st.pop_back(); } if (i < n) st.push_back(i); } vector<int> poz(mx + 1, -1), pop(n, -1); for (int i = 0; i < n; ++i) { pop[i] = poz[a[i]]; poz[a[i]] = i; } vector<int> dp(n, 1); int wynik = 1; for (int v = mx; v >= 1; --v) { for (int i = poz[v]; i != -1; i = pop[i]) { if (nxt[i] == -1) dp[i] = 1; else dp[i] = 1 + dp[nxt[i]]; wynik = max(wynik, dp[i]); } } cout << wynik << '\n'; } |
English