思路:
据说又有O(n)的算法。。算了。。我还是贴个nlog(n)的二分区间长度,满足长度越小越“不满足”。所以二分一下,judge一下就好了;
略坑的就是。。。一日为山峰终生为山峰。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e4+10;
bool vis[N];
int h[N];
int a[N],num,n;
int Left,Right;
bool cmp(int x,int y)
{
return x>y;
}
void init(){
num=0;
int x,q=sqrt(n);
for(int i=1;i <= q;i++){
if(n%i==0){
a[++num]=i;
x=n/i;
if(x != i) a[++num]=x;
}
}
sort(a+1,a+num+1,cmp);
for(int i=2;i<n;i++)
if(h[i] > h[i-1] && h[i] > h[i+1])
vis[i]=true;
// for(int i=1;i<=num;i++)
// printf("%d ",a[i]);
// puts("");
}
bool Judge(int seg){
int s;
for(s=1;s<=n;s+=seg){
bool flag=false;
for(int L=s;L<=s+seg-1;L++)
{
if(vis[L]){
flag=true;
break;
}
}
if(!flag) return false;
}
return true;
}
void solve(){
Left=1,Right=num;
while(Left < Right){
int Mid = Left + (Right - Left +1)/2;
if(Judge(a[Mid]))
Left=Mid;
else
Right=Mid-1;
}
if(Judge(a[Left]))
printf("%d\n",n/a[Left]);
else
puts("0");
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&h[i]);
init();
solve();
return 0;
}