[BZOJ2792][Poi2012]Well
2792: [Poi2012]Well
Time Limit: 40 Sec Memory Limit: 64 MB
Submit: 137 Solved: 61
[Submit][Status][Discuss]
Description
给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一。
Input
Output
Sample Input
8 7 6 5 5 5 5 5 6 6 7 8 9 7 5 5
Sample Output
HINT
将X序列变为
Source
要求最小化最大值,肯定想到二分。
二分判定的难点在于如何求最小的能等于0的数。
假如要把i位置变成0,则一定会修改一个区间[L,R]
所以必须满足a[L]>(i-L)*mid,且a[R]>(R-i)*mid
这两个显然都是单调的,然后[L,R]这个区间要想修改最小的话,最后一定变成前后两个等差数列,其中公差=mid,第i项=0,直接统计答案即可。
#include<cstdio>
#include<algorithm>
#define N 1000010
#define mid (l+r>>1)
#define ll long long
using namespace std;
int n,a[N],b[N];
ll m,f[N],sum[N];
inline int check(int x)
{
ll ans=;
for(int i=;i<=n;i++)b[i]=a[i];
for(int i=;i<=n;i++)
if(b[i]-b[i-]>x)
ans+=b[i]-b[i-]-x,b[i]=b[i-]+x;
for(int i=n-;i;i--)
if(b[i]-b[i+]>x)
ans+=b[i]-b[i+]-x,b[i]=b[i+]+x;
for(int i=;i<=n;i++)
sum[i]=sum[i-]+b[i];
if(ans>m)return ;
for(int i=,j=;i<=n;i++)
{
while(j<i&&b[j]<=(ll)(i-j)*x)j++;
f[i]=sum[i-]-sum[j-]-(ll)(i-j)*(i-j+)/*x;
}
for(int i=n,j=n;i;i--)
{
while(j>i&&b[j]<=(ll)(j-i)*x)j--;
f[i]+=sum[j]-sum[i]-(ll)(j-i)*(j-i+)/*x;
}
for(int i=;i<=n;i++)
if(b[i]+f[i]+ans<=m)return i;
return ;
}
int main()
{
int l=,r=,ans=;
scanf("%d%lld",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),r=max(r,a[i]);
while(l<=r)
{
if(check(mid))ans=mid,r=mid-;
else l=mid+;
}
printf("%d %d",check(ans),ans);
}
[BZOJ2792][Poi2012]Well的更多相关文章
- POI2012题解
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
- 【BZOJ2792】[Poi2012]Well 二分+双指针法
[BZOJ2792][Poi2012]Well Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足X ...
- 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 ...
随机推荐
- SQL分页存储过程——表名、返回的列、排序字段、排序类型、条件、页尺寸、页码
ALTER PROCEDURE [dbo].[SP_LGY_ICU_PAGECUT] ), -- 表名 ) = '*', -- 需要返回的列 )='''', -- 排序的欄位名 , -- 設置排序類型 ...
- Spring XML配置文件示例(一)——<Servlet name>-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- scala中的抽象类
scala中也有和java,c#类似的抽象类,抽象类会有部分实现,也有没有实现的方法定义.抽象类最大的特征是不能直接实例化.下面我们看个例子. abstract class Animal { def ...
- gitlab安装部署
参考文章: https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/install/centos http://www.xsjxmx.com/ ...
- <转>WCF中出现死锁或者超时
WCF回调中的死锁 一.服务器端死锁 对于如下服务: [ServiceContract(CallbackContract = typeof(INotify))] public class Downlo ...
- ok6410按键中断编程,linux按键裸机
6410按键中断编程 一.流程分析 外部中断控制寄存器(s3c6410x 359页) 1.EINTxCONy: 外部中断组x的第y个控制器.这个就是设置中断的触发方式.有5种触发方式. 2.EINT ...
- python web编程-概念预热篇
互联网正在引发一场革命??不喜欢看概念的跳过,注意这里仅仅是一些从python核心编程一书的摘抄 这正是最激动人心的一部分了,web编程 Web 客户端和服务器端交互使用的“语言”,Web 交互的标准 ...
- Process32First 返回FALSE的原因
一般情况下是不会返回FALSE的,如果发生了,请检查: 1:系统为UNICODE的,一定要设置PROCESSENTRY32的dwSize为sizeof(PROCESSENTRY32)即可..
- 初探Docker
本文旨在让大家了解什么是Docker,并带领大家体验Docker使用的整个流程. 开启Docker学习之旅前,我们简单描述几个场景,应该很多人都有碰到过: 小凹同学开发了一个web应用,服务器环境是: ...
- Excel动态合并行、合并列
背景: 在北京工作的时候,又一次同事问了我这样一个问题,说我要把从数据库获取到的数据直接通过NPOI进行导出,但是我对导出的格式要特殊的要求,如图: 冥思苦想,最终顺利帮同事解决问题,虽然有点瑕疵,但 ...