博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POI2012]STU-Well
阅读量:6278 次
发布时间:2019-06-22

本文共 1705 字,大约阅读时间需要 5 分钟。

题意翻译

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

(1≤n≤1 000 0001m10^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
using namespace std;typedef long long ll;const int N=1000000+5;int n;ll m;ll a[N],b[N],c[N];ll ans,pos;int lp;//min a[k]'s kbool che(ll mid){ memcpy(b,a,sizeof a); ll tot=0; lp=0; for(int i=n-1;i;i--){ if(b[i]-b[i+1]>mid) tot+=b[i]-(b[i+1]+mid),b[i]=b[i+1]+mid; } for(int i=2;i<=n;i++){ if(b[i]-b[i-1]>mid) tot+=b[i]-(b[i-1]+mid),b[i]=b[i-1]+mid; } if(tot>m) return false; ll L=1,R=1; ll sum=0; ll len=0,nd=0; for(int i=1;i<=n;i++){ while(R
=(R-i)*mid) sum+=b[R],R++; while(L
<=(i-L)*mid) sum-=b[L],L++; len=R-i-1; nd=(len+1)*len/2*mid; len=i-L; nd+=(len+1)*len/2*mid; if(sum-nd+tot<=m){ lp=i;return true; } } return false;}int main(){ scanf("%d%lld",&n,&m); ll l=0,r=0; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); r=max(r,a[i]); } while(l<=r){ ll mid=(l+r)>>1; if(che(mid)) ans=mid,pos=lp,r=mid-1; else l=mid+1; } printf("%lld %lld",pos,ans); return 0;}

 

转载于:https://www.cnblogs.com/Miracevin/p/9676637.html

你可能感兴趣的文章
unbtu使用笔记
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>
hadoop、hbase、zookeeper集群搭建
查看>>
python中一切皆对象------类的基础(五)
查看>>
modprobe
查看>>
android中用ExpandableListView实现三级扩展列表
查看>>
%Error opening tftp://255.255.255.255/cisconet.cfg
查看>>
java读取excel、txt 文件内容,传到、显示到另一个页面的文本框里面。
查看>>
《从零开始学Swift》学习笔记(Day 51)——扩展构造函数
查看>>
python多线程队列安全
查看>>
[汇编语言学习笔记][第四章第一个程序的编写]
查看>>
android 打开各种文件(setDataAndType)转:
查看>>
补交:最最原始的第一次作业(当时没有选上课,所以不知道)
查看>>