码迷,mamicode.com
首页 > 其他好文 > 详细

【bzoj2600】[Ioi2011]ricehub 双指针法

时间:2018-01-19 11:29:47      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:typedef   include   turn   return   div   microsoft   while   双指针   存在   

题目描述

给出数轴上坐标从小到大的 $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 <cstdio>
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;
}

 

 

【bzoj2600】[Ioi2011]ricehub 双指针法

标签:typedef   include   turn   return   div   microsoft   while   双指针   存在   

原文地址:https://www.cnblogs.com/GXZlegend/p/8315216.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!