#include <bits/stdc++.h>
using namespace std;
#define fors(u, n, s) for(int u = (s); u<(n); u++)
#define foru(u, n) fors(u, n, 0)
#define f first
#define s second
#define vec vector
#define pb push_back
#define sz(x) ((int)x.size())
typedef long long ll;
// #define debug(x) cout << __LINE__ << " | " << x << endl
#define debug(x) {}
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
const int L = 22;
void solve() {
int n; cin >> n;
vec<int> v(n);
foru(i, n) cin >> v[i];
vec<vec<int>> jmp(n, vec<int>(L));
foru(i, n) jmp[i][0] = v[i];
fors(j, L, 1) foru(i, n){
if(i+(1<<(j-1)) < n) jmp[i][j] = max(jmp[i][j-1], jmp[i+(1<<(j-1))][j-1]);
else jmp[i][j] = INT_MAX;
}
vec<int> idx(n);
foru(i, n) idx[i] = i;
auto cmp = [&](int a, int b){
return v[a] > v[b];
};
sort(idx.begin(), idx.end(), cmp);
vec<int> dp(n);
for(auto i : idx){
debug(i);
int nxt = i;
int val = v[i];
for(int j = L-1; j>=0; j--){
debug(nxt);
if(nxt == n) break;
if(jmp[nxt][j] <= val) nxt += (1<<j);
}
debug(nxt);
if(nxt == n){
nxt = 0;
for(int j = L-1; j>=0; j--){
if(nxt == n) break;
if(jmp[nxt][j] <= val) nxt += (1<<j);
}
}
if(nxt == n || v[nxt] <= val) dp[i] = 1;
else dp[i] = dp[nxt] + 1;
}
int ans = 0;
foru(i, n) ans = max(ans, dp[i]);
cout << ans << endl;
}
int main()
{
cin.tie(0); cout.tie(0);
ios_base::sync_with_stdio(0);
srand(time(NULL));
solve();
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <bits/stdc++.h> using namespace std; #define fors(u, n, s) for(int u = (s); u<(n); u++) #define foru(u, n) fors(u, n, 0) #define f first #define s second #define vec vector #define pb push_back #define sz(x) ((int)x.size()) typedef long long ll; // #define debug(x) cout << __LINE__ << " | " << x << endl #define debug(x) {} #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") const int L = 22; void solve() { int n; cin >> n; vec<int> v(n); foru(i, n) cin >> v[i]; vec<vec<int>> jmp(n, vec<int>(L)); foru(i, n) jmp[i][0] = v[i]; fors(j, L, 1) foru(i, n){ if(i+(1<<(j-1)) < n) jmp[i][j] = max(jmp[i][j-1], jmp[i+(1<<(j-1))][j-1]); else jmp[i][j] = INT_MAX; } vec<int> idx(n); foru(i, n) idx[i] = i; auto cmp = [&](int a, int b){ return v[a] > v[b]; }; sort(idx.begin(), idx.end(), cmp); vec<int> dp(n); for(auto i : idx){ debug(i); int nxt = i; int val = v[i]; for(int j = L-1; j>=0; j--){ debug(nxt); if(nxt == n) break; if(jmp[nxt][j] <= val) nxt += (1<<j); } debug(nxt); if(nxt == n){ nxt = 0; for(int j = L-1; j>=0; j--){ if(nxt == n) break; if(jmp[nxt][j] <= val) nxt += (1<<j); } } if(nxt == n || v[nxt] <= val) dp[i] = 1; else dp[i] = dp[nxt] + 1; } int ans = 0; foru(i, n) ans = max(ans, dp[i]); cout << ans << endl; } int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); srand(time(NULL)); solve(); return 0; } |
English