[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 ...
随机推荐
- jQuery Mobile学习之grid、等待显示的ajax效果、页面跳转、页面跳转传递参数等(二)
Index.cshtml <!-- Start of second page --> <section data-role="page" id="bar ...
- 谈谈Delph中的类和对象2---类可以理解成一种特殊的数据结构、类型转换
三.类可以理解成一种特殊的数据结构 我们知道数据类型可以进行强制类型转换,类既然可以理解成一种数据类型,那么它也应该可以进行类型转换.比如下面代码为一个按钮(Button1)的单击事件 procedu ...
- Delphi函数参数传递 默认参数(传值)、var(穿址)、out(输出)、const(常数)四类
Delphi的参数可以分为:默认参数(传值).var(传址).out(输出).const(常数)四类 可以对比C/C++的相关知识,类比学习. 1.默认参数是传值,不会被改变,例子 function ...
- NPOI读写Excel
1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...
- 判断一个类到底是从哪个jar包中调用的工具类
项目中使用的jar包较多时,会出现jar冲突的情况,有时候很难判断当前使用的这个类是从哪个jar包中调用的.因为一般我们只能看到jar包的名称,不清楚其中的类的目录结构. 这个类的作用就是说明当前调用 ...
- redmine安装部署
http://www.sxt.cn/u/4647/blog/5557 http://blog.chinaunix.net/uid-26729093-id-4669508.html http://my. ...
- 如何在java程序中调用linux命令或者shell脚本
转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...
- C语言面试
最全的C语言试题总结 第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被 ...
- Codeforces Round #248 (Div. 2) C. Ryouko's Memory Note
题目链接:http://codeforces.com/contest/433/problem/C 思路:可以想到,要把某一个数字变成他的相邻中的数字的其中一个,这样总和才会减少,于是我们可以把每个数的 ...
- Lingo语法
基本语法 ! 注释,末尾需要分号 ~ 分隔符 集成员无论用何种字符字符标记,它的索引都是从1开始连续计数 在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知. init: endinit ...