[POI2012]STU-Well
题意翻译
给定一个非负整数序列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的更多相关文章
- 洛谷P3534 [POI2012] STU
题目 二分好题 首先用二分找最小的绝对值差,对于每个a[i]都两个方向扫一遍,先都改成差满足的形式,然后再找a[k]等于0的情况,发现如果a[k]要变成0,则从他到左右两个方向上必会有两个连续的区间也 ...
- 2795: [Poi2012]A Horrible Poem
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 484 Solved: 235[Subm ...
- [BZOJ2803][Poi2012]Prefixuffix
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 219 Solved: 95[Submit][St ...
- [BZOJ2799][Poi2012]Salaries
2799: [Poi2012]Salaries Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 91 Solved: 54[Submit][Statu ...
- [BZOJ2797][Poi2012]Squarks
2797: [Poi2012]Squarks Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 211 Solved: 89[Submit][Status ...
- [BZOJ2791][Poi2012]Rendezvous
2791: [Poi2012]Rendezvous Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 95 Solved: 71[Submit][Sta ...
- [BZOJ2795][Poi2012]A Horrible Poem
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 261 Solved: 150[Subm ...
- [BZOJ2794][Poi2012]Cloakroom
2794: [Poi2012]Cloakroom Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 167 Solved: 119[Submit][St ...
- [BZOJ2793][Poi2012]Vouchers
2793: [Poi2012]Vouchers Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 316 Solved: 148[Submit][Stat ...
- [BZOJ2792][Poi2012]Well
2792: [Poi2012]Well Time Limit: 40 Sec Memory Limit: 64 MBSubmit: 137 Solved: 61[Submit][Status][D ...
随机推荐
- django orm 操作表
django orm 操作表 1.基本操作 增 models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs inser ...
- Python处理PDF和Word文档常用的方法
Python处理PDF和Word文档的模块是PyPDF2,使用之前需要先导入. 打开一个PDF文档的操作顺序是:用open()函数打开文件并用一个变量来接收,然后把变量给传递给PdfFileReade ...
- 第十三次ScrumMeeting博客
第十三次ScrumMeeting博客 本次会议于12月3日(六)21时30分整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕. 1. 每个人的工作(有Issue的内容和链 ...
- dubbo支持协议及具体对比
对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况,本文参考dubbo官方文档 http://dubbo.io/User+Guide-zh.htm dubbo共支持如下几种通信协议: ...
- 大华摄像头WEB页面集成
对于海康.大华的摄像头web页面内的集成方式,根据浏览器类型,通常是采用以下形式: IE内核:调用ocx控件 例如: <object width="100%" height= ...
- iOS软件"一天八杯水“app开发过程
作为一个ios系统测试者和app外观设计者.我们首先要了解iOS系统的开发工具和资源.xcode和iOS sdk作为一个免费的开发环境值得我们去学习和了解.interface builder提供创建了 ...
- win10系统下载-靠谱推荐
win10系统下载的靠谱推荐: 1.http://www.xitongtiandi.net/wenzhang/win10/12926.html 2.https://msdn.itellyou.cn/ ...
- android assets下rar文件解压到sd卡
参考的 http://hzy3774.iteye.com/blog/1704419 不过只能解压zip文件 最多也就能解压1M多把 ,我1.5M的可以,4M的不行 还有...之前傻逼的把raw和 ...
- ns3 模拟无线网络通信
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* * This program is fre ...
- PTA计算平均值(一波三折)
PTA计算平均值( 一波三折) 现在为若干组整数分别计算平均值. 已知这些整数的绝对值都小于100,每组整数的数量不少于1个,不大于20个. 输入格式:首先输入K(不小于2,不大于20).接下来每一行 ...