tj
2025-09-13 20:46:41
发布于:广东
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N=5e5+3;
ll l=1,r=1e14;
ll n,k,mid,ans;
ll Hp[N],num[N];
bool check(ll p){
ll over=(ll)sqrt(p)+1;
ll cnt=0;
memset(num,0,sizeof(num));
ll plus=0,i=0,i2=0;
for(ll j=n;j>=1;j-=1){
if(num[j+1]){
plus+=num[j+1];
i+=num[j+1](j+1);
i2+=num[j+1](j+1)(j+1);
}
if((j+over<=n) and (num[j+over])){
plus-=num[j+over];
i-=num[j+over](j+over);
i2-=num[j+over](j+over)(j+over);
}
ll allhurt=1llplusp-1lljjplus+2lli*j-i2;
if(Hp[j]>=allhurt){
num[j]=(Hp[j]-allhurt)/p+1;
cnt+=num[j];
}
if(cnt>k) return false;
}
return true;
}
signed main(){
cin>>n>>k;
for(ll i=1;i<=n;i+=1){
cin>>Hp[i];
}
while(l<=r){
mid=(l+r)/2;
if(check(mid)){
r=mid-1;
ans=mid;
}
else l=mid+1;
}
cout<<ans;
return 0;
}
这里空空如也





有帮助,赞一个