博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj2600】[Ioi2011]ricehub 双指针法
阅读量:4973 次
发布时间:2019-06-12

本文共 872 字,大约阅读时间需要 2 分钟。

题目描述

给出数轴上坐标从小到大的 $R$ 个点,坐标范围在 $1\sim L$ 之间。选出一段连续的点,满足:存在一个点,使得所有选出的点到其距离和不超过 $B$ 。求最多能够选出多少点。

$R\le 10^5,L\le 10^9,B\le 2\times 10^{15}$

输入

第一行 三个整数 R L B

接下来R行 每行一个整数 表示X[i]

输出

一个整数 最多稻米数

样例输入

5 20 6

1
2
10
12
14

样例输出

3


题解

双指针法

傻题,显然对于一段连续的点,使得距离和最小的点是它们的中位数。

于是使用双指针法,用前缀和求距离和即可。

时间复杂度 $O(n)$ 

#include 
typedef long long ll;ll a[100010] , sum[100010];int main(){ int n , i , mid , p = 1 , ans = 0; ll m , k; scanf("%d%lld%lld" , &n , &m , &k); for(i = 1 ; i <= n ; i ++ ) scanf("%lld" , &a[i]) , sum[i] = sum[i - 1] + a[i]; for(i = 1 ; i <= n ; i ++ ) { while(p <= n && (mid = (p + i) >> 1 , sum[p] - sum[mid] - a[mid] * (p - mid)) + (a[mid] * (mid - i + 1) - sum[mid] + sum[i - 1]) <= k) p ++ ; if(ans < p - i) ans = p - i; } printf("%d\n" , ans); return 0;}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/8315216.html

你可能感兴趣的文章
httpencode编码
查看>>
cross socket和msgpack的数据序列和还原
查看>>
解决跨操作系统平台JSON中文乱码问题
查看>>
DELPHI搭建centos开发环境
查看>>
IdHTTPServer允许跨域访问
查看>>
更新.net core 3.0,dotnet ef命令无法使用的解决办法
查看>>
React躬行记(13)——React Router
查看>>
前端利器躬行记(1)——npm
查看>>
前端利器躬行记(2)——Babel
查看>>
前端利器躬行记(6)——Fiddler
查看>>
Forbidden You don't have permission to access / on this server.
查看>>
Intellij Idea新建web项目(转)
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
centos iptables
查看>>
unity3d 移动与旋转 2
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>