(3486)HDU
2015-06-04 19:55
288 查看
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define LOCAL
#define ll long long
#define lll unsigned long long
#define MAX 200010
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
using namespace std;
/*
题意:问你分成X区间,x最小的情况下,取每个区间的最大值,求和,大于K
想法:枚举区间长度和个数 二分+RMQ
PS:http://m.blog.csdn.net/blog/dr5459/9936607
*/
int n;
int a[MAX];
int dp[MAX][30];
void RMQ_init()//初始化
{
for(int i=0;i<n;i++)
dp[i][0] = a[i];
for(int j=1;(1<<j)<=n;j++)
{
for(int i=0;i+(1<<j)-1<n;i++)
dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
//查询函数
int RMQ(int L,int R)
{
int k=0;
while(1<<(k+1)<=R-L+1)k++;
return max(dp[L][k],dp[R-(1<<k)+1][k]);
}
bool solve(int len,int k,int s)
{
int sum = 0;
for(int i = 1; i<=s; i++)
{
int l = (i - 1)*len ;
int r = len*i - 1;
sum+=RMQ(l,r);
if(sum>k)
return 1;
}
return 0;
}
int main()
{
// freopen("date.in","r",stdin);
int k;
while(~scanf("%d%d",&n,&k))
{
int sum = 0;
if(n==-1&&k==-1)break;
for(int i =0; i<n; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum<=k)
{
puts("-1");
continue;
}
RMQ_init();
int ans;
int l = 1;
int r = n;
while(l<=r)
{
int mid = (l+r)>>1;
if(solve(n/mid,k,mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
printf("%d\n",ans);
}
return 0;
}
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define LOCAL
#define ll long long
#define lll unsigned long long
#define MAX 200010
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
using namespace std;
/*
题意:问你分成X区间,x最小的情况下,取每个区间的最大值,求和,大于K
想法:枚举区间长度和个数 二分+RMQ
PS:http://m.blog.csdn.net/blog/dr5459/9936607
*/
int n;
int a[MAX];
int dp[MAX][30];
void RMQ_init()//初始化
{
for(int i=0;i<n;i++)
dp[i][0] = a[i];
for(int j=1;(1<<j)<=n;j++)
{
for(int i=0;i+(1<<j)-1<n;i++)
dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
//查询函数
int RMQ(int L,int R)
{
int k=0;
while(1<<(k+1)<=R-L+1)k++;
return max(dp[L][k],dp[R-(1<<k)+1][k]);
}
bool solve(int len,int k,int s)
{
int sum = 0;
for(int i = 1; i<=s; i++)
{
int l = (i - 1)*len ;
int r = len*i - 1;
sum+=RMQ(l,r);
if(sum>k)
return 1;
}
return 0;
}
int main()
{
// freopen("date.in","r",stdin);
int k;
while(~scanf("%d%d",&n,&k))
{
int sum = 0;
if(n==-1&&k==-1)break;
for(int i =0; i<n; i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum<=k)
{
puts("-1");
continue;
}
RMQ_init();
int ans;
int l = 1;
int r = n;
while(l<=r)
{
int mid = (l+r)>>1;
if(solve(n/mid,k,mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- js-数组去重
- J2EE中ssh的整合
- HDU 1443 Joseph
- 聚集索引和非聚集索引
- (10.3.5.5)产品需求文档的写作(五) – 用例文档(UML用例图、流程图)
- php面向对象(OOP)—static和const
- 【leetcode每日一题】NO141.Linked List Cycle
- [Machine Learning] Learning to rank算法简介
- (10.3.5.3)产品需求文档的写作(三) – 原型设计(手绘原型,灰模原型,交互原型)
- 一些树的知识
- Python Package Management
- 第三章四十一题
- BZOJ 1072 [SCOI2007]排列perm 状压DP
- 黑客们的故事(连载一)关于黑客
- 【文件下载】--文件下载的几种方式
- 掌握 Dojo 工具包
- javascript DOM基础
- iOS开发 - 多线程间通信
- 实现医生工作站的病程模板功能的代码(十二)
- 如何撤销浏览器注入JS代码的执行效果?