hdu 3717 二分+队列维护
2013-10-17 15:31
447 查看
思路:已知当前的总长度和为len,当前的伤害为sum,伤害次数为 num.那么对下一个点的伤害值sum=sum+2*len+num;
这个是通过(x+1)^2展开化简就能得到。
这个是通过(x+1)^2展开化简就能得到。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #define Maxn 100010 #define LL __int64 #define inf 1e12 using namespace std; LL num[Maxn],cnt[Maxn],n,k; bool OK(LL x) { LL suma,sumb,ans,po,i,numa; LL j=n; suma=sumb=ans=numa=0; for(i=n;i>=1;i--){ if(j>i){ while((j-i)*(j-i)>=x){ suma-=cnt[j]*(j-i-1)*(j-i-1); sumb-=cnt[j]*(j-i-1); numa-=cnt[j]; j--; } } suma+=2*sumb+numa; sumb+=numa; if(num[i]-numa*x+suma<0) cnt[i]=0; else cnt[i]=(num[i]-numa*x+suma)/x+1; numa+=cnt[i]; ans+=cnt[i]; } return ans<=k; } int main() { int i,j,t; LL mx; scanf("%d",&t); while(t--){ scanf("%I64d%I64d",&n,&k); mx=0; for(i=1;i<=n;i++){ scanf("%d",&num[i]); mx=max(mx,num[i]); } LL l,r,mid; l=1,r=inf; while(l<r){ mid=(l+r)>>1; if(OK(mid)) r=mid; else l=mid+1; } printf("%I64d\n",l); } return 0; }
相关文章推荐
- Linux下keepalived+mysql实现高可用
- nginx安装
- ibm cognos 10 for linux安装步骤
- 解决NTFS分区上的代码在linux上编译后没有权限执行
- OpenGL 学习资源
- linux之chmod
- 你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对?
- linux共享内存通信
- OMAP3630 Linux I2C总线驱动分析
- [linux]How to set PATH in shell script, and keep it avaiable even after it exits
- 2003系统安装出现stop:0X000007B错误解决方法
- photoshop 输出切片成透明背景png图片方法
- linux下.tar.gz和.gz文件解压详解
- CentOS忘记root密码解决办法
- 博弈题算法小结
- Linux_Linux文件类型
- CentOs系统安装mysql数据库
- OpenCV学习之视频读取与帧的提取、显示及保存
- 迁移iftop软件至新服务器(ldd命令)
- Linux : 衡量CPU性能的指标