不满足单调性,所以二分解法不正确(虽然可以过OJ),
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=200000+10;
int dp[maxn][20],mylog[maxn],n;
long long k;
void read(int &d)
{
char ch;
while(ch=getchar(),ch<48||ch>57); d=ch-48;
while(ch=getchar(),ch<58&&ch>47) d=d*10+ch-48;
}
void init(int n)
{
int i,j,&lev=mylog[n];
for(j=1;j<=lev+1;j++)
for(i=0;i+(1<<j)<=n;i++)
dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}
int query(int l,int r)
{
int &lev=mylog[r-l+1];
return max(dp[l-1][lev],dp[r-(1<<lev)][lev]);
}
int main()
{
for(int i=0;i<18;i++)
for(int j=1<<i;j<(1<<i+1)&&j<maxn;j++)
mylog[j]=i;
while(cin>>n>>k)
{
if(n<0&&k<0) return 0;
for(int i=0;i<n;i++) read(dp[i][0]);
init(n);
long long ans=0;
int i,j,l,r,tmp,eve, m, per = -1, ps;
for(i = 1; i <= n; i++)
{
eve = n / i;
m = eve * i;
//per==eve?j=ps+1:ans=0,j=1;
if(per == eve)
j=ps+1;
else ans=0,j=1;
for(; j + eve - 1 <= m; j += eve)
{
l = j;
r = j + eve - 1;
tmp = query(l, r);
ans += tmp;
if(ans > k) break;
}
if(ans > k) break;
per = eve;
ps = m;
}
cout<<(ans>k?i:-1)<<endl;
}
}