#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef double db;
typedef vector<int> vi;
typedef pair<int, int> pii;
#define all(x) (x).begin(), (x).end()
const int siz=1<<20;
int tri[2*siz+7];
void upd(int l, int r){
l+=siz-1;
r+=siz+1;
while(r-l>1){
if(l%2==0){
tri[l+1]++;
}
if(r%2==1){
tri[r-1]++;
}
l>>=1;
r>>=1;
}
}
int read(int v){
v+=siz;
int ans=0;
while(v>0){
ans+=tri[v];
v>>=1;
}
return ans;
}
vector<int> tab;
vector<pii> hm;
void solve() {
int n, i, j, ma=0, c, a, b;
cin >> n;
tab.resize(n);
for(i=0; i<n; i++){
cin >> tab[i];
ma=max(ma, tab[i]);
}
for(i=0; i<n; i++){
tab.push_back(tab[i]);
if(tab[i]==ma){
a=i;
break;
}
}
for(i=0; i<n; i++){
tab[i]=tab[i+a+1];
}
while(tab.size()>n) tab.pop_back();
hm.resize(n);
hm[0]={tab.back(), -1};
upd(0,0);
for(i=1; i<n; i++){
a=i-1;
while(tab[i]>tab[a]){
a=hm[a].second;
if(a==-1) break;
}
if(a==-1) hm[i]=hm[0];
else hm[i]={tab[a], a};
upd(hm[i].second+1, i);
// cout << i << ' ' << hm[i].first << ' ' << hm[i].second << '\n';
}
int ans=0;
for(i=0; i<n; i++){
ans=max(ans, read(i));
}
cout << ans << '\n';
}
signed main () {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;
// cin >> t;
while(t-- ) solve();
}
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 int long long typedef long long ll; typedef double db; typedef vector<int> vi; typedef pair<int, int> pii; #define all(x) (x).begin(), (x).end() const int siz=1<<20; int tri[2*siz+7]; void upd(int l, int r){ l+=siz-1; r+=siz+1; while(r-l>1){ if(l%2==0){ tri[l+1]++; } if(r%2==1){ tri[r-1]++; } l>>=1; r>>=1; } } int read(int v){ v+=siz; int ans=0; while(v>0){ ans+=tri[v]; v>>=1; } return ans; } vector<int> tab; vector<pii> hm; void solve() { int n, i, j, ma=0, c, a, b; cin >> n; tab.resize(n); for(i=0; i<n; i++){ cin >> tab[i]; ma=max(ma, tab[i]); } for(i=0; i<n; i++){ tab.push_back(tab[i]); if(tab[i]==ma){ a=i; break; } } for(i=0; i<n; i++){ tab[i]=tab[i+a+1]; } while(tab.size()>n) tab.pop_back(); hm.resize(n); hm[0]={tab.back(), -1}; upd(0,0); for(i=1; i<n; i++){ a=i-1; while(tab[i]>tab[a]){ a=hm[a].second; if(a==-1) break; } if(a==-1) hm[i]=hm[0]; else hm[i]={tab[a], a}; upd(hm[i].second+1, i); // cout << i << ' ' << hm[i].first << ' ' << hm[i].second << '\n'; } int ans=0; for(i=0; i<n; i++){ ans=max(ans, read(i)); } cout << ans << '\n'; } signed main () { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; // cin >> t; while(t-- ) solve(); } |
English