题意翻译

给定一个非负整数序列A,每次操作可以选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max⁡(∣xi−xi−1∣)最小,输出这个最小值以及此时最小的k

(1≤n≤1 000 000,1≤m≤10^18)

题解:

最大值最小,还要输出,那就直接二分咯。

由于每次都只能减,所以,

每次二分的内部,可以先把max(|xi-xi-1|)调出来。

从左到右扫一遍,a[i]>a[i-1]+mid 那么a[i]=a[i-1]+mid tot+=a[i]-(a[i-1]+mid)

从右到左扫一遍,a[i-1]>a[i]+mid 同理。

注意循环顺序。因为不能先砍最高的。可能之后更低的会更低。

这样最少的次数保证了max(..)<=mid

然后改枚举最低点的k了。

如果不存在一个点为0

那么,这个点为k的话,两边一定是一个倒阶梯。

回文阶梯形状双等差数列

这个阶梯的L,R有单调性。(L即为i左边第一个可以不用删的位置。R为i右边第一个可以不用删的位置。)

可以直接移动。

具体一些,如果L+1位置比所需的小,那么可以右移L,

如果R不行,那么右移R,直到比所需的位置小。其实同理。

注意,正反循环顺序保证正确性。

双指针移动判定条件及边界。

等差数组求和别写错...

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+;
int n;
ll m;
ll a[N],b[N],c[N];
ll ans,pos;
int lp;//min a[k]'s k
bool che(ll mid){
memcpy(b,a,sizeof a);
ll tot=;
lp=;
for(int i=n-;i;i--){
if(b[i]-b[i+]>mid) tot+=b[i]-(b[i+]+mid),b[i]=b[i+]+mid;
}
for(int i=;i<=n;i++){
if(b[i]-b[i-]>mid) tot+=b[i]-(b[i-]+mid),b[i]=b[i-]+mid;
}
if(tot>m) return false;
ll L=,R=;
ll sum=;
ll len=,nd=;
for(int i=;i<=n;i++){
while(R<n&&b[R]>=(R-i)*mid) sum+=b[R],R++;
while(L<i&&b[L]<=(i-L)*mid) sum-=b[L],L++;
len=R-i-;
nd=(len+)*len/*mid;
len=i-L;
nd+=(len+)*len/*mid;
if(sum-nd+tot<=m){
lp=i;return true;
}
}
return false;
}
int main()
{
scanf("%d%lld",&n,&m);
ll l=,r=;
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
r=max(r,a[i]);
}
while(l<=r){
ll mid=(l+r)>>;
if(che(mid)) ans=mid,pos=lp,r=mid-;
else l=mid+;
}
printf("%lld %lld",pos,ans);
return ;
}

[POI2012]STU-Well的更多相关文章

  1. 洛谷P3534 [POI2012] STU

    题目 二分好题 首先用二分找最小的绝对值差,对于每个a[i]都两个方向扫一遍,先都改成差满足的形式,然后再找a[k]等于0的情况,发现如果a[k]要变成0,则从他到左右两个方向上必会有两个连续的区间也 ...

  2. 2795: [Poi2012]A Horrible Poem

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 235[Subm ...

  3. [BZOJ2803][Poi2012]Prefixuffix

    2803: [Poi2012]Prefixuffix Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 219  Solved: 95[Submit][St ...

  4. [BZOJ2799][Poi2012]Salaries

    2799: [Poi2012]Salaries Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 91  Solved: 54[Submit][Statu ...

  5. [BZOJ2797][Poi2012]Squarks

    2797: [Poi2012]Squarks Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 211  Solved: 89[Submit][Status ...

  6. [BZOJ2791][Poi2012]Rendezvous

    2791: [Poi2012]Rendezvous Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 95  Solved: 71[Submit][Sta ...

  7. [BZOJ2795][Poi2012]A Horrible Poem

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 150[Subm ...

  8. [BZOJ2794][Poi2012]Cloakroom

    2794: [Poi2012]Cloakroom Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 167  Solved: 119[Submit][St ...

  9. [BZOJ2793][Poi2012]Vouchers

    2793: [Poi2012]Vouchers Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 316  Solved: 148[Submit][Stat ...

  10. [BZOJ2792][Poi2012]Well

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

随机推荐

  1. 主成分分析——PCA

    在数据挖掘过程中,当一个对象有多个属性(即该对象的测量过程产生多个变量)时,会产生高维度数据,这给数据挖掘工作带来了难度,我们希望用较少的变量来描述数据的绝大多数信息,此时一个比较好的方法是先对数据进 ...

  2. PytorchZerotoAll学习笔记(一)

    Pytorch的安装请参考torch的官方文档,传送门:https://pytorch.org/get-started/locally/ Numpy的复习 如果你之前没有学过Numpy的话,建议去看看 ...

  3. Sony深度学习框架 - Neural Network Console - 教程(1)- 原来深度学习可以如此简单

    “什么情况!?居然不是黑色背景+白色文字的命令行.对,今天要介绍的是一个拥有白嫩的用户界面的深度学习框架.” 人工智能.神经网络.深度学习,这些概念近年已经涌入每个人的生活中,我想很多人早就按捺不住想 ...

  4. 笨办法学Python - 习题4: Variables and Names

    1.习题 4: 变量(variable)和命名 学习目标:了解Python中变量的定义,学习定义简明易记的变量名 变量:变量是存储内存中的值,就是每定义一个变量就会在内存中开辟一个空间.基于变量的类型 ...

  5. Daily Scrum1 11.3

    今天是我们团队进入代码实现阶段的第一天,经过一周对上一届项目代码的阅读和研究,队员们已经从代码中分析出我们这次项目将要修改和补充的地方,我们接下来要做的地方就是在两周的时间内将团队项目在alpha阶段 ...

  6. 从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0的解决方案

    从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0 java.lang.UnsupportedClassVersionError: PR/Sor ...

  7. 第一个Sprint冲刺成果

    组长:李咏江,组员:叶煜稳,谢洪跃,周伟雄 进程:第一个算法功能完成

  8. C#设置代码只在调试模式下执行

    获取一个值,它指示调试器是否已附加到进程. 命名空间:Namespace:System.Diagnostics if (Debugger.IsAttached) { Response.Write(&q ...

  9. 6/9 sprint2 看板和燃尽图的更新

  10. sql update set from 的用法 (转)

    关键字: update set from 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值     表a:id, name               1   ...