#include <bits/stdc++.h>
using namespace std;
int n;
int tab[1'000'007];
int mx=-1;
stack<int> s;
// dla indexow
vector<int> adj[1'000'007];
int dp[1'000'007];
bool seen1[1'000'007];
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i=0; i<n; i++) cin >> tab[i];
for (int i=0; i<n; i++) mx = max(mx,tab[i]);
for (int _=0; _<2; _++) {
for (int i=0; i<n; i++) {
while (!s.empty() && tab[s.top()] < tab[i]) {
int x = s.top();
if (!seen1[x]) {
adj[x].push_back(i);
seen1[x] = true;
}
s.pop();
}
if (_ == 0) s.push(i);
}
}
// for (int i=0; i<n; i++) {
// cout << i << ": ";
// for (int el : adj[i]) cout << el << ' ';
// cout << endl;
// }
vector<int> kolejnosc(n);
iota(kolejnosc.begin(), kolejnosc.end(), 0);
sort(kolejnosc.begin(), kolejnosc.end(), [](int a, int b) {
return tab[a] > tab[b];
});
int out=0;
for (int i : kolejnosc) {
if (!seen1[i]) {
dp[i] = 1;
} else {
int nxt = adj[i][0];
dp[i] = 1 + dp[nxt];
}
out = max(out, dp[i]);
}
cout << out << 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 | #include <bits/stdc++.h> using namespace std; int n; int tab[1'000'007]; int mx=-1; stack<int> s; // dla indexow vector<int> adj[1'000'007]; int dp[1'000'007]; bool seen1[1'000'007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i=0; i<n; i++) cin >> tab[i]; for (int i=0; i<n; i++) mx = max(mx,tab[i]); for (int _=0; _<2; _++) { for (int i=0; i<n; i++) { while (!s.empty() && tab[s.top()] < tab[i]) { int x = s.top(); if (!seen1[x]) { adj[x].push_back(i); seen1[x] = true; } s.pop(); } if (_ == 0) s.push(i); } } // for (int i=0; i<n; i++) { // cout << i << ": "; // for (int el : adj[i]) cout << el << ' '; // cout << endl; // } vector<int> kolejnosc(n); iota(kolejnosc.begin(), kolejnosc.end(), 0); sort(kolejnosc.begin(), kolejnosc.end(), [](int a, int b) { return tab[a] > tab[b]; }); int out=0; for (int i : kolejnosc) { if (!seen1[i]) { dp[i] = 1; } else { int nxt = adj[i][0]; dp[i] = 1 + dp[nxt]; } out = max(out, dp[i]); } cout << out << endl; return 0; } |
English