#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <deque>
#include <map>
#include <queue>
#include <climits>
using namespace std;
using ll=long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
N*=2;
vector<int> V(N + 2);
for (int i = 1; i <= N/2; i++){
cin >> V[i]; V[i+N/2]=V[i];
}
int INF = N + 1;
vector<int> nast(N + 2, INF);
vector<int> stos;
for (int i = N; i >= 1; i--) {
while (!stos.empty() && V[stos.back()] <= V[i]) stos.pop_back();
nast[i] = stos.empty() ? INF : stos.back();
stos.push_back(i);
}
int LOG = 1;
while ((1 << LOG) <= N) LOG++;
vector<vector<int>> up(LOG, vector<int>(N + 2, INF));
for (int i = 1; i <= N; i++) up[0][i] = nast[i];
up[0][INF] = INF;
for (int k = 1; k < LOG; k++) {
for (int i = 1; i <= N + 1; i++) {
up[k][i] = up[k - 1][ up[k - 1][i] ];
}
}
int wynik = 1;
for (int i = 1; i <= N/2; i++) {
int R = i + N/2 - 1;
int cur = i;
int cnt = 1;
for (int k = LOG - 1; k >= 0; k--) {
if (up[k][cur] <= R) {
cnt += (1 << k);
cur = up[k][cur];
}
}
wynik = max(wynik, cnt);
}
cout << wynik << "\n";
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 68 | #include <iostream> #include <vector> #include <string> #include <algorithm> #include <numeric> #include <cmath> #include <deque> #include <map> #include <queue> #include <climits> using namespace std; using ll=long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; N*=2; vector<int> V(N + 2); for (int i = 1; i <= N/2; i++){ cin >> V[i]; V[i+N/2]=V[i]; } int INF = N + 1; vector<int> nast(N + 2, INF); vector<int> stos; for (int i = N; i >= 1; i--) { while (!stos.empty() && V[stos.back()] <= V[i]) stos.pop_back(); nast[i] = stos.empty() ? INF : stos.back(); stos.push_back(i); } int LOG = 1; while ((1 << LOG) <= N) LOG++; vector<vector<int>> up(LOG, vector<int>(N + 2, INF)); for (int i = 1; i <= N; i++) up[0][i] = nast[i]; up[0][INF] = INF; for (int k = 1; k < LOG; k++) { for (int i = 1; i <= N + 1; i++) { up[k][i] = up[k - 1][ up[k - 1][i] ]; } } int wynik = 1; for (int i = 1; i <= N/2; i++) { int R = i + N/2 - 1; int cur = i; int cnt = 1; for (int k = LOG - 1; k >= 0; k--) { if (up[k][cur] <= R) { cnt += (1 << k); cur = up[k][cur]; } } wynik = max(wynik, cnt); } cout << wynik << "\n"; return 0; } |
English