给定一个非负整数序列A,每次操作可以选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max{|Ai−Ai+1|}最小,输出这个最小lk以及最小值。

Solution

最大值最小,显然是需要二分的,而且我们发现答案确实是有单调性的。

接下来我们正着扫一遍整个序列,把差值大于二分出来的值的数调整值合法。

接下来我们就要考虑ak=0的情况,这个东西并没有什么单调性,我们只能从头枚举,直到找到第一个满足要求的就可以了。

考虑当一个数变成零之后,为了满足我们二分出来的答案,我们需要构造这样一个东西。

0                      0

0 0                0 0

0 0 0          0 0 0

0 0 0 0    0 0 0 0

0 0 0 0 0 0 0 0 0

两边是等差数列,为了计算序列的长度,我们需要计算出两个数组表示当ai=0是等差数列的左端点和右端点。

我们可以把左右分开算。

比如计算右端点,我们从i向右暴力扩展,当发现当前数字的值小于目标值是就不再扩展了,因为后面已经符合要求了。

最后枚举点,用等差数列求和算一下就可以了。

Code

#include<iostream>
#include<cstdio>
#define N 1000002
using namespace std;
typedef long long ll;
ll ans2,ans,b[N],s1[N],le[N],ri[N],a[N],n,m,sum[N];
bool check(ll pos){ll num=0;for(int i=1;i<=n;++i)b[i]=a[i];for(int i=2;i<=n;++i)if(b[i]-b[i-1]>pos)num+=b[i]-b[i-1]-pos,b[i]=b[i-1]+pos;if(num>m)return 0;for(int i=n-1;i>=1;--i)if(b[i]-b[i+1]>pos)num+=b[i]-b[i+1]-pos,b[i]=b[i+1]+pos;if(num>m)return 0;for(int i=1;i<=n;++i)sum[i]=sum[i-1]+b[i];for(int i=1,j=1;i<=n;++i){while(b[j]<=(i-j)*pos&&j<i)j++;le[i]=j;}for(int i=n,j=n;i>=1;--i){while(b[j]<=(j-i)*pos&&j>i)j--;ri[i]=j;}for(int i=1;i<=n;++i)if((num+sum[ri[i]]-sum[le[i]-1]-pos*((i-le[i])*(i-le[i]+1)+(ri[i]-i)*(ri[i]-i+1))/2)<=m){ans=i;return 1;} return 0;
}
int main(){scanf("%lld%lld",&n,&m);    ll l=0,r=1e9;for(int i=1;i<=n;++i)scanf("%lld",&a[i]);while(l<=r){int mid=(l+r)>>1;if(check(mid)){ans2=mid;r=mid-1;}else l=mid+1;}printf("%lld %lld",ans,ans2);return 0;
} 

转载于:https://www.cnblogs.com/ZH-comld/p/9677644.html

[POI2012]STU-Well(二分答案+神仙操作)相关推荐

  1. 【基础算法】二分法(二分答案,二分查找),三分法,Dinkelbach算法,算法详解+例题剖析

    目录 一 . 二分法 二分搜索得要求: 二分查找步骤: 二分答案: 玄学的二分(二分答案) 二 . 三分法 例题 三.01分数规划问题相关算法与题目讲解(二分法与Dinkelbach算法) 一 . 二 ...

  2. 【题解】 [HEOI2016]排序题解 (二分答案,线段树)

    题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行 ...

  3. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  4. P4343-[SHOI2015]自动刷题机【二分答案】

    正题 题目链接:https://www.luogu.org/problem/P4343 题目大意 nnn个操作每个操作加几行代码或减几行代码,若代码积累到xxx行就自动删除所有代码并切掉一道题. 已知 ...

  5. 数学题 贪心+二分答案

    Description 现在有两个数组 AA 和 BB, 分别包含 xx 与 yy 个元素. 定义一个新的数组 CC, CC 中包含 x×yx×y 个元素,为 AA 中所有元素除以 BB 中所有元素. ...

  6. poj 3258 River Hopscotch 二分答案

    题目地址: http://poj.org/problem?id=3258 题目思路: 首先,如果只减少一部,那么一定要干掉最短的那段距离(一旦不消灭,最小的还是它,并没有达到使最小值取最大的理想情况) ...

  7. 【TJOI2016】【bzoj4552】排序(二分答案+线段树01排序)

    problem 给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序 排序分为两种 1:(0,l,r)表示将区间[l,r]的数字升序排序 2:(1,l,r)表示将区间[l,r]的数字降序排序 ...

  8. poj 1064 java_poj 1064(二分答案)

    题意: 有N条绳子,长度分别为 length[1,2,3,........,N]. 如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长有多长? 结果保留两位小数. 题解: 二分可能的长度. AC ...

  9. week 4 hw TT的神秘礼物 二分答案

    题意: TT 是一位重度爱猫人士,每日沉溺于 B 站上的猫咪频道.有一天,TT 的好友 ZJM 决定交给 TT 一个难题,如果 TT 能够解决这个难题,ZJM 就会买一只可爱猫咪送给 TT.任务内容是 ...

  10. 二分答案(超级详细)

    要说二分答案,首先要从二分说起,首先先上题: 题目简单的来讲,就是有一个由小到大的数列,从中搜索一个数的下标,我们先来看一下二分的模板: while(start<end){mid=start+( ...

最新文章

  1. SQL Server中的分页查询
  2. matlab cat
  3. ip对应的区域查询(php版)(转)
  4. 个性化资源管理器软件Q-dir_6.36(附安装包)
  5. 解除服务器端口号占用及服务器端口号的修改
  6. windows下eclipse远程连接hadoop集群开发mapreduce
  7. jquery $(this)和this
  8. css 浮动效果 0302
  9. TOP 10 开源的推荐系统简介
  10. python 百度搜索结果_Python洗涤百度搜索结果
  11. WebStorm配置(2016/11/18更新)
  12. html5 密码强度,前端开发判断输入密码强度
  13. python列表删除会出现一个错误 list index out of range
  14. 语音助手的涅槃关头,我们应该完全抛弃屏幕还是选择“语音+图形界面”?
  15. 2020安徽省大数据与人工智能网络赛题目
  16. Django(十二)模型表关系的实现
  17. python csv文件和xlsx文件混杂时,提取指定列数据并合并
  18. 网络线综合布线接地注意事项
  19. 1.6 airtest控制MUMU模拟器
  20. 谷歌邮箱无法与服务器建立连接失败,GMAIL SMTP错误:无法连接到服务器

热门文章

  1. 不同机器,打印速度相差巨大
  2. 梦笔记2021-03-05
  3. maven teavm-idea-artifacts: Command execution failed.: Process exited with an error: 1 Exit value: 1
  4. MAC编译freetype
  5. Android Export时错误提示:Conversion to Dalvik format failed with error 1
  6. 王振质问于谦,死得越多说明越伟大?
  7. 飞机上使用定位功能的体验
  8. NWT创业失败原因之层层分析
  9. 条件变量对多线程求素数的改进
  10. datax参数设置_DataX-操作HDFS