博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2792 : [Poi2012]Well
阅读量:6229 次
发布时间:2019-06-21

本文共 1015 字,大约阅读时间需要 3 分钟。

二分答案mid,将差距先都调到mid以内。

首先从左往右扫,a[i]=min(a[i],a[i-1]+mid)。

然后从右往左扫,a[i]=min(a[i],a[i+1]+mid)。

枚举要变为0的位置,求出L,R使得:

a[L]>(i-L)mid

a[R]>(R-i)mid

此时只需要把[L,i]和[i,R]修改成一个等差数列即可满足条件且代价最小。

注意到随着i的右移,L递增;随着i的左移,R递减,所以可以$O(n)$完成判定。

 

#include
#define N 1000010typedef long long ll;int n,i,j,a[N],b[N],l,r,t,mid,z,k;ll m,s[N],f[N],now;inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}inline int min(int a,int b){return a
m)return 0; } for(i=j=1;i<=n;i++){ while(j
<=(ll)(i-j)*mid)j++; f[i]=s[i-1]-s[j-1]-(ll)(1+i-j)*(i-j)*mid/2; } for(i=j=n;i;i--){ while(j>i&&b[j]<=(ll)(j-i)*mid)j--; f[i]+=s[j]-s[i]-(ll)(1+j-i)*(j-i)*mid/2; } for(i=1;i<=n;i++)if(f[i]+b[i]+now<=m)return i; return 0;}int main(){ read(n),scanf("%lld",&m); for(i=1;i<=n;i++)read(a[i]),r=r>a[i]?r:a[i]; while(l<=r)if(t=check(mid=(l+r)>>1))r=(z=mid)-1,k=t;else l=mid+1; return printf("%d %d",k,z),0;}

  

转载地址:http://jstna.baihongyu.com/

你可能感兴趣的文章
Mac下没有make命令解决办法
查看>>
DLL中传递STL参数
查看>>
postgresql 范围类型
查看>>
隐藏 tengine 和 tomcat 版本号
查看>>
非面试向跨域实践详解
查看>>
一个非常好看的图片选择框架LPhotoPicker,确定不来看看么
查看>>
线上压缩代码-定位错误
查看>>
一个简洁且强大的状态管理库 - iFlow
查看>>
IP地址转换函数——inet_pton inet_ntop inet_aton inet_addr inet_ntoa
查看>>
设计模式笔记---4. 装饰模式
查看>>
springmvc + mybatis + ehcache + redis 分布式架构
查看>>
爬虫学习日记(四)分析Freenium
查看>>
nginx事件模块 -- 第五篇 epoll add
查看>>
共享栈基本操作
查看>>
Java 生成 PDF 文档
查看>>
深度学习:用生成对抗网络(GAN)来恢复高分辨率(高精度)图片 (附源码,模型与数据集)...
查看>>
缓存与数据库双写,不一致问题及解决方案
查看>>
Swift基础-部分关键字说明与示例
查看>>
【云服务月刊】2018年第1期:阿里云客户服务部总经理张颖杰:用心聆听,服务见智...
查看>>
99%的Java程序员都不知道的Spring中的@Transactional注解的坑
查看>>