bzoj2600[Ioi2011]ricehub 双指针法

Posted GXZlegend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

 

以上是关于bzoj2600[Ioi2011]ricehub 双指针法的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 2600: [Ioi2011]ricehub|暴力|中位数

BZOJ 2600: [Ioi2011]ricehub|暴力|中位数

bzoj2600[Ioi2011]ricehub 双指针法

bzoj 2600 ricehub

[Ioi2011]ricehub

[IOI 2011]ricehub