#include <bits/stdc++.h>
using namespace std;
const int base = 1 << 21;
int tree[base*2];
void add(int a, int b, int x){
a += base;
b += base;
while(a <= b){
if(a%2 == 1) tree[a++] += x;
if(b%2 == 0) tree[b--] += x;
a /= 2;
b /= 2;
}
}
int query(int a){
a += base;
int ans = 0;
while(a > 0){
ans += tree[a];
a /= 2;
}
return ans;
}
int main(){
int n;
cin >> n;
int tab[2*n], maks = -1, nextbigger[2*n], imaks = 0;
for(int i = 0; i < n; i++){
cin >> tab[i];
tab[i+n] = tab[i];
}
deque<int> dq;
for(int i = 0; i < n*2; i++){
while(!dq.empty() && dq.front() < i-n) dq.pop_front();
while(!dq.empty() && tab[dq.back()] < tab[i]) dq.pop_back();
if(dq.empty()) nextbigger[i] = -1;
else nextbigger[i] = dq.back();
dq.push_back(i);
}
for(int i = 0; i < n; i++){
add(nextbigger[i]+1, i, 1);
add(nextbigger[i+n]+1, i+n, 1);
}
int wynik = 0;
for(int i = 0; i < n; i++){
wynik = max(wynik, query(i));
}
cout << wynik << endl;
}
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 | #include <bits/stdc++.h> using namespace std; const int base = 1 << 21; int tree[base*2]; void add(int a, int b, int x){ a += base; b += base; while(a <= b){ if(a%2 == 1) tree[a++] += x; if(b%2 == 0) tree[b--] += x; a /= 2; b /= 2; } } int query(int a){ a += base; int ans = 0; while(a > 0){ ans += tree[a]; a /= 2; } return ans; } int main(){ int n; cin >> n; int tab[2*n], maks = -1, nextbigger[2*n], imaks = 0; for(int i = 0; i < n; i++){ cin >> tab[i]; tab[i+n] = tab[i]; } deque<int> dq; for(int i = 0; i < n*2; i++){ while(!dq.empty() && dq.front() < i-n) dq.pop_front(); while(!dq.empty() && tab[dq.back()] < tab[i]) dq.pop_back(); if(dq.empty()) nextbigger[i] = -1; else nextbigger[i] = dq.back(); dq.push_back(i); } for(int i = 0; i < n; i++){ add(nextbigger[i]+1, i, 1); add(nextbigger[i+n]+1, i+n, 1); } int wynik = 0; for(int i = 0; i < n; i++){ wynik = max(wynik, query(i)); } cout << wynik << endl; } |
English