题意翻译

给定一个非负整数序列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. js中 null, undefined, 0,空字符串,false,不全等比较

    null == undefined // true null == ''  // false null == 0 // false null == false // false undefined = ...

  2. Team Member Introduction and Division of Work

    Team leader Name:宋天舒 Student Number:12061166 Interested In: Information safety. Responsible For: Des ...

  3. java读取properties文件的几种方法

    一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取 Properties p=new Properties(); ...

  4. php----函数大全

    字符串函数 数组函数 数学函数

  5. Leetcode题库——13.罗马数字转整数

    @author: ZZQ @software: PyCharm @file: Luoma2Int.py @time: 2018/9/16 17:06 要求: 罗马数字转数字 字符 数值 I 1 V 5 ...

  6. POJ 1185 炮兵阵地 状压dp

    题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...

  7. Beta冲刺(5/7)

    队名:天机组 组员1友林 228(组长) 今日完成:修改代码 明天计划:封装代码 剩余任务:优化网络通讯机制 主要困难:暂无 收获及疑问:暂无 组员2方宜 225 今日完成:优化了ui界面 明天计划: ...

  8. 牛客网国庆集训派对Day5 题目 2018年

    链接:https://www.nowcoder.com/acm/contest/205/L来源:牛客网参考博客:https://blog.csdn.net/HTallperson/article/de ...

  9. 20_集合_第20天(Map、可变参数、Collections)_讲义

    今日内容介绍 1.Map接口 2.模拟斗地主洗牌发牌 01Map集合概述 A:Map集合概述: 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式 ...

  10. Java 多生产者消费者问题

    /* 生产者,消费者.   多生产者,多消费者的问题. if判断标记,只有一次,会导致不该运行的线程运行了.出现了数据错误的情况. while判断标记,解决了线程获取执行权后,是否要运行!   not ...