【题解】火枪打怪

在这里插入图片描述
法一.
在这里插入图片描述
法二.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
法三.(本人的作死方法,调了一晚上)
x j = p − ( i − j ) 2 x_j=p-(i-j)^2 xj=p(ij)2

x j + 1 = p − ( i − j − 1 ) 2 = p − ( i − j ) 2 − 1 + 2 ( i − j ) x_j+1=p-(i-j-1)^2=p-(i-j)^2-1+2(i-j) xj+1=p(ij1)2=p(ij)21+2(ij)

x j = x j + 1 + ( 1 + 2 i ) − 2 j x_j=x_{j+1}+(1+2i)-2j xj=xj+1+(1+2i)2j

推广一下:

x j = x j + 1 + s u m − t o t ∗ 2 j x_j=x_{j+1}+sum-tot*2j xj=xj+1+sumtot2j

用sum维护1+2i,然后递推即可。

对于超出范围的部分,需要减去递推的增量,可以令 x [ i − 1 − q ] − = m i d − ( q + 1 ) ∗ ( q + 1 ) x[i-1-q]-=mid-(q+1)*(q+1) x[i1q]=mid(q+1)(q+1) s u m sum sum, t o t tot tot部分减去所含增量即可。

#include<bits/stdc++.h> using namespace std; const int N=5*1e5+5; long long n,k,a[N],b[N],x[N],y[N],der[N],der2[N]; bool check(long long mid) { long long tot=0,sum=0,q=sqrt(mid); for(int i=1;i<=n+1;i++) x[i]=0,der[i]=0,der2[i]=0; for(int i=n;i>=1;i--) { x[i]=x[i]+x[i+1]-sum+(tot-der2[i+1])*2*i; b[i]=a[i]-x[i]; sum-=der[i]; der2[i]+=der2[i+1]; if(b[i]>=0) { long long t=(b[i]-1)/mid+1; tot+=t,sum+=t*(2*i-1),x[i]+=t*mid; if(i-1-q>0) x[i-1-q]-=t*(mid-(q+1)*(q+1)),der[i-1-q]+=t*(2*i-1),der2[i-1-q]+=t; } } return tot<=k; } int main() { scanf("%lld%lld",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); long long l=1,r=1e18,ans=0; while(l<=r) { long long mid=(l+r)>>1; if(check(mid)) r=mid-1,ans=mid; else l=mid+1; } printf("%lld",ans); }

__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530399.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示