bzoj2792
首先想到二分答案是吧,设为lim
这道题难在判定,我们先不管将一个数变为0的条件
先使序列满足相邻差<=lim,这个正着扫一遍反着扫一遍即可
然后我们就要处理将一个数变为0的修改代价
当i变为0后,我们分别考虑左右两边的代价,对于左边
如果a[j]>(i-j)*lim的话,aj要变成a[i]+(i-j)*lim,否则的话,对于k<=j都不用变化,右边类似的道理
观察式子,a[j]>(i-j)*lim即a[j]+j*lim>i*lim,怎么做很明显了吧……
var a,b,d:array[..] of longint;
c,v:array[..] of int64;
l,r,mx,mid,ans,i,n:longint;
m,s:int64; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; function check(lim:longint):longint;
var y,i:longint;
s,w,t:int64;
begin
for i:= to n do
b[i]:=a[i];
t:=;
for i:= to n- do
if b[i+]>b[i]+lim then
begin
t:=t+b[i+]-(b[i]+lim);
b[i+]:=b[i]+lim;
end;
for i:=n downto do
if b[i-]>b[i]+lim then
begin
t:=t+b[i-]-(b[i]+lim);
b[i-]:=b[i]+lim;
end;
if t>m then exit();
fillchar(c,sizeof(c),);
fillchar(d,sizeof(d),);
for i:= to n do
begin
y:=min(i+b[i] div lim,n);
c[y]:=c[y]+b[i]-int64(y-i)*int64(lim);
inc(d[y]);
if i<> then c[i-]:=c[i-]-b[i];
dec(d[i]);
end;
s:=;
w:=;
for i:=n downto do
begin
s:=s+c[i]+w*int64(lim);
v[i]:=s;
w:=w+d[i];
end;
fillchar(c,sizeof(c),);
fillchar(d,sizeof(d),);
for i:=n downto do
begin
y:=max(i-b[i] div lim,);
c[y]:=c[y]+b[i]-int64(i-y)*int64(lim);
inc(d[y]);
c[i]:=c[i]-b[i];
if i<> then dec(d[i-]);
end;
s:=;
w:=;
for i:= to n do
begin
s:=s+c[i]+w*int64(lim);
v[i]:=v[i]+s;
w:=w+d[i];
end;
for i:= to n do
if t+v[i]<=m then exit(i); exit();
end; begin
readln(n,m);
for i:= to n do
begin
read(a[i]);
s:=s+a[i];
if a[i]>mx then mx:=a[i];
end;
if s<=m then
begin
writeln('1 0');
halt;
end;
l:=;
r:=mx;
while l<=r do
begin
mid:=(l+r) shr ;
if check(mid)> then
begin
ans:=mid;
r:=mid-;
end
else l:=mid+;
end;
writeln(check(ans),' ',ans);
end.
bzoj2792的更多相关文章
- 【BZOJ2792】[Poi2012]Well 二分+双指针法
[BZOJ2792][Poi2012]Well Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足X ...
- [BZOJ2792][Poi2012]Well
2792: [Poi2012]Well Time Limit: 40 Sec Memory Limit: 64 MBSubmit: 137 Solved: 61[Submit][Status][D ...
- POI2012题解
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
随机推荐
- Makedown常用符号整理
整理自:http://www.jianshu.com/p/1e402922ee32 不过这里发现博客园的makedown语法支持还不完善,代码语法显示挺有问题的,比较遗憾. 标题 # 一级标题## 二 ...
- html+css学习笔记 [基础1]
---------------------------------------------------------------------------------------------------- ...
- springMVC 简单事例
本帖最后由 悲观主义者一枚 于 2015-1-31 17:55 编辑 使用SpringMvc开发Android WebService入门教程1.首先大家先创建一个JavaWeb项目2.然后加入Spri ...
- C# 中使用JSON - DataContractJsonSerializer
C#中使用JSON不需要使用第三方库,使用.NET Framwork3.5自带的System.Runtime.Serialization.Json即可很好的完成JSON的解析. 关于JSON的入门介绍 ...
- java中的freopen
在做ACM题目的时候,为节省输入测试数据的时间,我们通常将数据复制到一个文本文档里,然后从文档里读出,避免在控制台一个数据一个数据的输入. 之前一直用的C/C++,freopen用起来很方便,如下: ...
- untiy 插件工具: 游戏中 策划数据Excel 导出到项目中
https://github.com/zhutaorun/Excel2Unity,这个项目是直接下载就可以用的, 其中原理和相关的解释 http://blog.csdn.net/neil3d/arti ...
- SaaS系列介绍之十三: SaaS系统体系架构
1 系统体系架构设计 软件开发中系统体系架构决定了一个系统稳定性.健壮性.可扩展性.兼容性和可用性,它是系统的灵魂.体系架构是架构师所关注的核心.良好的体系架构是系统成功的开端,否则,再好的代码与设计 ...
- *[hackerrank]Lexicographic paths
https://www.hackerrank.com/contests/w9/challenges/lexicographic-steps 这题还是折腾很久的.题目意思相当于,比如有两个1两个0,那么 ...
- eclipse配置jdk问题
1.JDK安装成功,eclipse也安装成功,这时候实际上是可以不配置JDK,因为系统已经默认给你配置好了,
- Java基础:三步学会Java Socket编程
Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛 第一步 ...