[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 ...
随机推荐
- 几年前做家教写的C教程(之一)
C语言学习宝典 首先让我们认识什么是C语言. C语言是一种计算机开发语言,是一种非常基础的开发语言.能够用C语言做很多事情.C语言是顺序执行的程序. 程序应该包括数据描述,数据操作. C语言的数据类型 ...
- catch that cow (bfs 搜索的实际应用,和图的邻接表的bfs遍历基本上一样)
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 38263 Accepted: 11891 ...
- oracle使用dbms_metadata包取得所有对象DDL语句
当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...
- 攻城狮在路上(叁)Linux(二十三)--- linux磁盘参数修改(设备代码、设备名)
一.mknod:设置设备代码 linux中,所有的设备都是用文件来表示,文件通过major与minor数值来判断. major为主设备代码,minor为设备代码(需要查询),示例如下: /dev/hd ...
- jquery判断当前设备是手机还是电脑并跳转
<script type="text/javascript"> var commonURL = 'http://xxxx.com/'; function mobile_ ...
- [Eclipse] Eclipse配置Tomcat插件
1 . Eclipse IDE 3.6 for Java EE Developersat- 5.5.28 或者以上版本 : 2 . 安装 Tomcat 插件 , 文件名: tomcatPluginV3 ...
- Zigzag convert
public static String Convert(String s,int row) { char[] c=s.toCharArray(); int len=s.length(); Strin ...
- dwz中权限的控制
很多人不明白用dwz要如何在没有登录的时候跳转到登录页面,没有权限的时候弹出提示. 其实,作者在设计的时候,已经完全考虑到了这些需求. 不管是navTab还是dialog,dwz的页面加载最终都是通过 ...
- FZU Problem 2082 过路费 树链剖分
Problem 2082 过路费 Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...
- python学习第二天
dict字典 把数据放入dict:直接赋值.初始化时指定 pop删除key set集合 add添加元素 remove删除元素 字符串str是不可变对象,对字符串的操作都会返回新的字符串 pass 什么 ...