不满足单调性,所以二分解法不正确(虽然可以过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; } }