51nod1258【二分】

来源:互联网 发布:java 浏览器输入框 编辑:程序博客网 时间:2024/05/22 07:05
思路:

据说又有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;}


0 0
原创粉丝点击