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,并将它减一。

最终要求存在某个k满足Xk=0,并且z=max{|Xi - Xi+1|}最小。
输出最小的z和此时最小的k。
 
 
 

Input

第一行两个正整数n, m (1<=n<=1,000,000, 1<=m<=10^18)。第二行n个正整数X1,X2,...Xn (Xi<=10^9)。
 
 
 

Output

输出k和z。数据保证方案一定存在。
 
 
 

Sample Input

16 15
8 7 6 5 5 5 5 5 6 6 7 8 9 7 5 5

Sample Output

1 2

HINT

将X序列变为

0 2 4 5 5 5 5 5 6 6 7 8 9 7 5 5
 
此时k=1,z=2,共操作了8+5+2=15次。
 

Source

[Submit][Status][Discuss]

要求最小化最大值,肯定想到二分。

二分判定的难点在于如何求最小的能等于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的更多相关文章

  1. POI2012题解

    POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...

  2. 【BZOJ2792】[Poi2012]Well 二分+双指针法

    [BZOJ2792][Poi2012]Well Description 给出n个正整数X1,X2,...Xn,可以进行不超过m次操作,每次操作选择一个非零的Xi,并将它减一. 最终要求存在某个k满足X ...

  3. 2795: [Poi2012]A Horrible Poem

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 235[Subm ...

  4. [BZOJ2803][Poi2012]Prefixuffix

    2803: [Poi2012]Prefixuffix Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 219  Solved: 95[Submit][St ...

  5. [BZOJ2799][Poi2012]Salaries

    2799: [Poi2012]Salaries Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 91  Solved: 54[Submit][Statu ...

  6. [BZOJ2797][Poi2012]Squarks

    2797: [Poi2012]Squarks Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 211  Solved: 89[Submit][Status ...

  7. [BZOJ2791][Poi2012]Rendezvous

    2791: [Poi2012]Rendezvous Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 95  Solved: 71[Submit][Sta ...

  8. [BZOJ2795][Poi2012]A Horrible Poem

    2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 150[Subm ...

  9. [BZOJ2794][Poi2012]Cloakroom

    2794: [Poi2012]Cloakroom Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 167  Solved: 119[Submit][St ...

随机推荐

  1. 设计模式学习之组合模式(Composite,结构型模式)(10)

    转载地址:http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系 ...

  2. Android N 新特性 + APP开发注意事项

    1. 多窗口MultiWindow 多窗口MultiWindow,这是Android N里对开发者影响比较大的特性,也是大家疑问比较多的地方.站在开发者的角度其实不必太担心这个特性会导致我们需要修改很 ...

  3. 【转载】python super的用法

    转载地址: http://blog.csdn.net/cxm19830125/article/details/20610533 super的用法是调用继承类的初始化方法,如下面的代码: class A ...

  4. mysql 如何设置自动增长序列 sequence(一)

    背景:由于项目需要,必须用mysql设置主键自增长,而且想用字符串的.经过上网查找并且实验,终于做出了一套方案.现在就共享给大家! 解决思路:由于mysql不带sequence,所以要手写的,创建一张 ...

  5. 跟着鸟哥学Linux系列笔记0-如何解决问题

    跟着鸟哥学Linux系列笔记0-扫盲之概念 在发生问题怎么处理: 1.  在自己的主机.网络数据库上查询How-To或FAQ -Linux 自身的文件数据: /usr/share/doc -CLDP中 ...

  6. 不通过App Store实现ios应用分发下载安装

    最近公司的项目准备着手宣传工作了,宣传手册上要印制App的下载地址二维码,但是客户端应用还未上线,需要一种临时的方案解决应用分发下载问题,通常ios应用必须通过苹果应用商店才能下载安装,但是也可以看到 ...

  7. Redis持久化实践及灾难恢复模拟

    参考资料: Redis Persistence http://redis.io/topics/persistence Google Groups https://groups.google.com/f ...

  8. 【MongoDB】1.安装--以及简单使用

    第一次接触MongoDB    参考&粘贴:http://jingyan.baidu.com/article/ed15cb1b52b8661be2698162.html 一.安装 1.首先去官 ...

  9. JAVA Day5

                                         数组   1.数组是一组变量的集合,存储“相同数据类型”的一组数据: 连续的空间. 2.声明一个变量就是在内存空间划出一块合适 ...

  10. SpringHttpInvoker解析3-客户端实现

    主要的配置文件 <bean id="httpInvokerUserService" class="org.springframework.remoting.http ...