link : https://loj.ac/problem/2036
这个显然具有单调性,N小的话更容易A题,不仅因为A一次题减少的代码,并且A题的下限也低。
所以直接上二分就行了,注意上限一定不要设小,不然容易gg。
#include<bits/stdc++.h> #define ll long long #define maxn 100005 using namespace std; int a[maxn],n,K; ll l,r,mid,le,ri; inline int calc(){ int ans=0; ll now=0; for(int i=1;i<=n;i++){ now+=(ll)a[i]; if(now<0) now=0; else if(now>=mid) now=0,ans++; } return ans; } int main(){ scanf("%d%d",&n,&K); for(int i=1;i<=n;i++) scanf("%d",a+i); le=1ll<<62,ri=-(1ll<<62); l=1,r=n*(ll)(1ll<<30); while(l<=r){ mid=l+r>>1; if(calc()>=K) ri=mid,l=mid+1; else r=mid-1; } l=1,r=n*(ll)(1ll<<30); while(l<=r){ mid=l+r>>1; if(calc()<=K) le=mid,r=mid-1; else l=mid+1; } if(le<=ri) printf("%lld %lld\n",le,ri); else puts("-1"); return 0; }