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
- 51nod1258【二分】
- 51nod 1105---二分套二分
- 51nod 1105 二分套二分
- 51nod 1267【二分】
- 51nod1010【二分】
- 51Nod - 1065 二分
- 51nod1799 二分答案
- 【51Nod1799】二分答案
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分。
- 二分
- 二分
- 二分
- 二分
- VS2010/MFC 配置Halcon12 并显示图片
- QT入门
- Server responded "Algorithm negotiation failed"【SSH Secure链接服务器错误】
- Java.SE01.多线程_案例01
- 良好的微服务架构能够取代企业服务总线吗?
- 51nod1258【二分】
- 《大教堂和集市》读后感
- Picasso源码学习
- C++抽象编程——STL实战(3)——数组元素的移除与合并
- day04_DOM&xml
- itoa(),atoi()实现
- 【Leetcode】235. Lowest Common Ancestor of a Binary Search Tree
- POJ 3268
- 数据库连接池简介和 C3P0的JDBC配置