题目大意

给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一。

最终要求存在某个k满足Xk=0,并且z=max{|Xi - Xi+1|}最小。

输出最小的z和此时最小的k。

第一行两个正整数n, m (1<=n<=1,000,000, 1<=m<=10^18)。第二行n个正整数X1,X2,...Xn (Xi<=10^9)。

分析

我们考虑简单点的问题

我们要最小化z,考虑二分

对于没有要求变成0的问题

我们会尽可能使每个数操作后最大

因为没有+1操作

两个数相差大于mid时

只能大的数减下去

b[i]表示每个数最大是多少

从左往右扫一次,\(b[i]=min(b[i],b[i-1]+mid)\)

从右往左扫一次,\(b[i]=min(b[i],b[i+1]+mid)\)

然后我们枚举将哪一个数变成0

设枚举到i

我们只用找到最大的L满足\(b[L]<=(i-L)*mid\)

找到最小的R满足\(b[R]<=(R-i)*mid\)

此时(L,R)中的数一定要修改

修改成等差数列

稍微想一想可以证明此时对区间外的数没有任何影响

右注意到随着i增加,L-R区间也单调右移

two-pointer一下

solution

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
typedef long long LL;
using namespace std;
const int M=1000007; int n;
LL lim,ss=0;
int a[M];
int b[M];
LL s[M]; LL calc(LL d,LL l){
return d*(l*(l+1)/2);
} int check(int del){
LL c1=0,c2=0;
int i;
for(i=1;i<=n;i++) b[i]=a[i];
for(i=2;i<=n;i++) b[i]=min(b[i],b[i-1]+del);
for(i=n-1;i>0;i--) b[i]=min(b[i],b[i+1]+del);
for(i=1;i<=n;i++){
c1+=a[i]-b[i];
s[i]=b[i]+s[i-1];
}
if(c1>lim) return 0;
int l=1,r=2;
for(i=1;i<=n;i++){
while(l<i&&b[l]<=(i-l)*del) l++;
while(r<=n&&b[r]>(r-i)*del) r++;
c2=s[r-1]-s[l-1];
c2-=calc(del,i-l);
c2-=calc(del,r-1-i);
if(c1+c2<=lim) return i;
}
return 0;
} void solve(){
if(ss<=lim) {printf("1 0\n");return;}
int res=0,tp;
int l=1,r=1000000000,mid;
while(l<r){
mid=l+r>>1;
tp=check(mid);
if(tp){
r=mid;
res=tp;
}
else l=mid+1;
}
printf("%d %d\n",res,l);
} inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int main(){
int i;
scanf("%d%lld",&n,&lim);
for(i=1;i<=n;i++) a[i]=rd(),ss+=a[i];
solve();
return 0;
}

bzoj 2792 [Poi2012]Well 二分+dp+two_pointer的更多相关文章

  1. BZOJ 2792 Poi2012 Well 二分答案

    题目大意:给定一个非负整数序列A.每次操作能够选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max{Ai−Ai+1}最小,输出这个最小值以及此时最小的k 二分答案,然后验证的时候首 ...

  2. bzoj 2792: [Poi2012]Well【二分+贪心】

    #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const ...

  3. bzoj 2798 [Poi2012]Bidding 博弈论+dp

    题目大意 A和B两个人在玩一个游戏,这个游戏是他们轮流操作一对整数(x,y). 初始时(x,y)=(1,0),可以进行三种操作: 将(x,y)变成(1,x+y). 将(x,y)变成(2x,y). 将( ...

  4. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  5. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. BZOJ_2792_[Poi2012]Well_二分答案

    BZOJ_2792_[Poi2012]Well_二分答案 Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某 ...

  7. 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)

    传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...

  8. 【BZOJ】4985: 评分【DP】

    4985: 评分 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 148  Solved: 75[Submit][Status][Discuss] Des ...

  9. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

随机推荐

  1. CPP-网络/通信:gsoap 的教程和使用

    1.1.1     gSOAP 1.1.1 .1      简介 gSOAP 编译工具提供了一个 SOAP/XML 关于 C/C++ 语言的实现,从而让 C/C++ 语言研发 web 服务或客户端程式 ...

  2. axios的post请求方法---以Vue示例

    Axios向后端提交数据的参数格式是json,而并非用的是form传参,post表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使 ...

  3. Maven:项目结构

    目录结构图: project        |- src            |- main   //工程源代码目录                |- java        //工程java源代 ...

  4. numpy的linspace使用详解

    文档地址: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html Parameters(参数): start ...

  5. json转换为字典

    str---dict ata_dict=json.loads(data)

  6. python日记整理

    都是自己的学习总结,要是总结的有问题大佬麻烦评价一下我好修改,谢谢 python插件插件+pycharm基本用法+markdown文本编写+jupyter notebook的基本操作汇总 一.计算机基 ...

  7. UVALive - 3942 (DP + Trie树)

    给出一个长度不超过300000的字符串 S,然后给出 n 个长度不超过100的字符串. 如果字符串可以多次使用,用这 n 个字符串组成 S 的方法数是多少? 比如样例中,abcd = a + b + ...

  8. PAT Basic 1082

    1082 射击比赛 本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原 ...

  9. 常用C/C++预处理指令详解

    预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查.预处理命令以符号“#”开头. 常用的预处理指令包括: 宏定义:#define 文件包含:#include 条件编译:#i ...

  10. An entity cannot be annotated with both @Entity and @MappedSuperclass: com.example1.demo1.Entity.User错误

    项目问SpringDataJpa项目,在运行的过程中出现的以下错误: Caused by: org.hibernate.AnnotationException: An entity cannot be ...