首先想到二分答案是吧,设为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的更多相关文章

  1. 【BZOJ2792】[Poi2012]Well 二分+双指针法

    [BZOJ2792][Poi2012]Well Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足X ...

  2. [BZOJ2792][Poi2012]Well

    2792: [Poi2012]Well Time Limit: 40 Sec  Memory Limit: 64 MBSubmit: 137  Solved: 61[Submit][Status][D ...

  3. POI2012题解

    POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...

随机推荐

  1. FlashBuilder 4.7 破解方法

    |举报|字号订阅   方法一: 方法问题: 能破解,但破解后启动FB需等待较长时间,等一两分钟吧. 操作步骤: 与其它Adobe CS6破解方法相同,覆盖安装目录下的amtlib.dll文件即可.(文 ...

  2. ffmpeg mp3转ogg的命令

    ffmpeg.exe -y -i bb.mp3 -acodec libvorbis -ab 128k bb.ogg

  3. IntelliJ IDEA 15 创建maven项目

    说明 创建Maven项目的方式:手工创建 好处:参考IntelliJ IDEA 14 创建maven项目二(此文章描述了用此方式创建Maven项目的好处)及idea14使用maven创建web工程(此 ...

  4. 【BZOJ】【2561】最小生成树

    网络流/最小割 对于所有小于L的边求一个割使得U,V不连通,这样就可以保证L可能在最小生成树里. 最大生成树同理. 答案累加一下即可.(Orz Hzwer) (我一开始怎么会sb地去想到一起求呢……) ...

  5. LA 4329

    第一次敲树状数组  因为一个小错误 wa了 n 多遍  终于ac  太不容易了 /*********************************************************** ...

  6. spoj 147

    dfs枚举真值 #include <cstdio> #include <cstring> #include <cstdlib> #include <stack ...

  7. HDU 3461 Code Lock(并查集,合并区间,思路太难想了啊)

    完全没思路,题目也没看懂,直接参考大牛们的解法. http://www.myexception.cn/program/723825.html 题意是说有N个字母组成的密码锁,如[wersdfj],每一 ...

  8. SDUT1061Binomial Showdown(组合数)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1061 题意 : 表示这个题的英文没看懂,就看懂 ...

  9. JAVASCRIPT的一些知识点梳理

    春节闲点,可以安心的梳理一下以前不是很清楚的东东.. 看的是以下几个URL: http://web.jobbole.com/82520/ http://blog.csdn.net/luoweifu/a ...

  10. nmap使用详解

    nmap是一个网络探测和安全扫描程序, 系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息.nmap支持很多扫描技术,例如:UDP.TCP connect(). ...