HDU3486----Interviewe----二分+一维RMQ
2013-08-12 22:58
323 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3486
题目意思:
给定n个数的序列,让我们找前面k个区间的最大值之和,每个区间长度为n/k,如果有剩余的区间长度不足n/k则无视之。
现在让我们找最小的k使得和严格大于m。n<=20万,m <= 10亿。
解题思路:
用二分枚举k,然后用RMQ来查询区间内的最大值,即可
代码:
题目意思:
给定n个数的序列,让我们找前面k个区间的最大值之和,每个区间长度为n/k,如果有剩余的区间长度不足n/k则无视之。
现在让我们找最小的k使得和严格大于m。n<=20万,m <= 10亿。
解题思路:
用二分枚举k,然后用RMQ来查询区间内的最大值,即可
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 200000+10; const int maxn2 = 30; //这里要保证2^maxn2>maxn int d[maxn][30]; int a[maxn]; //如果是求最大值,则把min改成max就可以了 void init_rmq(int n)//初始化 { for(int i=0;i<n;i++) d[i][0] = a[i]; for(int j=1;(1<<j)<=n;j++) { for(int i=0;i+(1<<j)-1<n;i++) d[i][j] = max(d[i][j-1],d[i+(1<<(j-1))][j-1]); } } //查询函数 int query_rmq(int L,int R) { int k=0; while(1<<(k+1)<=R-L+1)k++; return max(d[L][k],d[R-(1<<k)+1][k]); } bool check(int len,int m,int t) { int sum = 0; for(int i=1;i<=t;i=i++) { sum += query_rmq((i-1)*len,i*len-1); if(sum > m) return true; } return false; } int main() { int n; int m; while(~scanf("%d %d\n",&n,&m)) { if(n<0 || m<0) break; int sum = 0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; } if(sum<=m) { printf("-1\n"); continue; } init_rmq(n); int l=1; int r=n; int ans; while(l<=r) { int mid = (l+r)>>1; if(check(n/mid,m,mid)) { ans = mid; r=mid-1; } else l=mid+1; } printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu 3486 Interviewe (二分+RMQ)
- 5.3.5 Interviewe (错误的二分,RMQ)(UNSOLVED)
- HDU3486-RMQ+二分
- hdu 3486 Interviewe (二分+RMQ)
- hdu 3486 Interviewe 二分+RMQ
- hdu3486 RMQ+二分
- hdu 3486 Interviewe (RMQ+二分)
- HDU3486 二分+RMQ
- 【HDU 3486】【二分+RMQ】 Interviewe 【最小化区间个数m,使得每个区间最大值和大于k】
- hdu3486 Interviewe (二分+线段树求区间最值)
- Codeforces Round #361 (Div. 2) D RMQ+二分
- Codeforces 689D Friends and Subsequences(二分+RMQ)
- codeforces 689D D. Friends and Subsequences(RMQ+二分)
- 2016 Multi-University Training Contest 1 1004 hdu 5726 二分+RMQ
- 【BZOJ5083】普及 单调栈+二分+RMQ
- BZOJ 4310 二分+SA+RMQ
- codeforces_689D. Friends and Subsequences(RMQ+二分)
- qduoj cfenglv的一道简单签到题(区间gcd rmq,二分)
- HDU 5726 GCD(rmq+二分)
- POJ 2452 Sticks Problem (暴力或者rmq+二分)