【bzoj2600】[Ioi2011]ricehub 双指针法

题目描述

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

 

 

posted @ 2018-01-19 08:24  GXZlegend  阅读(326)  评论(0编辑  收藏  举报