lydsy 2600(二分+中位数前缀和)米仓

2600: [Ioi2011]ricehub

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 691  Solved: 359
[Submit][Status][Discuss]

Description

乡间有一条笔直而长的路称为“米道”。沿着这条米道上 R 块稻田,每块稻田的坐标均
为一个 1 到 L 之间(含 1 和 L)的整数。这些稻田按照坐标以不减的顺序给出,即对于 0 ≤ i <
R,稻田 i 的坐标 X[i]满足 1 ≤ X[0] ≤ ... ≤ X[R-1] ≤ L。 
注意:可能有多块稻田位于同一个坐标上。 
我们计划建造一个米仓用于储存尽可能多的稻米。和稻田一样,米仓将建在米道上,其
坐标也是一个 1 到 L 之间的整数(含 1 和 L)。这个米仓可以建在满足上述条件的任一个位
置上,包括那些原来已有一个或多个稻田存在的位置。 
在收获季节,每一块稻田刚好出产一滿货车的稻米。为了将这些稻米运到米仓,需要雇
用一位货车司机来运米。司机的收费是每一满货车运送一个单位的距离收取 1 元。換言之,
将稻米从特定的稻田运到米仓的费用在数值上等于稻田坐标与米仓坐标之差的绝对值。 
不幸的是,今年预算有限,我们至多只能花费 B 元运费。你的任务是要帮我们找出一个
建造米仓的位置,可以收集到尽可能多的稻米。

Input

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

Output

一个整数 最多稻米数

Sample Input

5 20 6

1

2

10

12

14

Sample Output

3

HINT

1 ≤ R ≤ 100,000

1 ≤ L ≤ 1,000,000,000

0 ≤ B ≤ 2,000,000,000,000,000

HINT

Source

var
 i,j:longint;
 r,l,ans,num,x,y,mid,b,n:int64;
 a,f:array[0..200000] of int64;
function pd(mid:int64):boolean;
var i,j:longint; m,sum:int64;
begin
 for i:=1 to n-mid+1 do
  begin
   j:=i+mid-1;
   m:=(i+j) div 2;
   sum:=f[j]+f[i-1]-f[m]-f[m-1]+a[m]*(m-i)-a[m]*(j-m);
   //最重要的一句(记)
   if sum<=b then exit(true);
  end;
 exit(false);
end;
begin
 readln(n,y,b);
 for i:=1 to n do
  begin
   read(a[i]);
   f[i]:=f[i-1]+a[i];
  end;
 l:=1; r:=n;
 while r>=l do
  begin
   mid:=(r+l) div 2;
   if pd(mid) then
    begin
     ans:=mid;
     l:=mid+1;
    end
   else r:=mid-1;
  end;
 writeln(ans);
end.
时间: 2024-12-29 07:33:02

lydsy 2600(二分+中位数前缀和)米仓的相关文章

2600 米仓 大视野评测

Description 乡间有一条笔直而长的路称为"米道".沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ≤ i <R,稻田 i 的坐标 X[i]满足 1 ≤ X[0] ≤ ... ≤ X[R-1] ≤ L. 注意:可能有多块稻田位于同一个坐标上. 我们计划建造一个米仓用于储存尽可能多的稻米.和稻田一样,米仓将建在米道上,其坐标也是一个 1 到 L 之间的整数(含 1 和 L).这个米仓

IOI 2011 Rice Hub 米仓

题目 分析 首先来观察一下这题的数据范围,Subtask 4当中的数据量10^15大到惊人的程度.很显然这是我们所不能够处理的数据量.但转而看R的大小,就令人能够接受了,那么不难想到,这里有一个离散化的思路. 然后我们考虑如何安排这个米仓.这个米仓其实就相当于一个"中位数",也就是安排在米仓能够处理的区间的正当中. 这里出现了一个"区间"的概念,那么我们就可以想到用一个类似二分的思想来枚举区间的左右边界. 首先O(R)枚举左边界,然后嵌一个while查右边界,写一个

IOI2011ricehub米仓

Description 乡间有一条笔直而长的路称为"米道".沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ≤ i <R,稻田 i 的坐标 X[i]满足 1 ≤ X[0] ≤ ... ≤ X[R-1] ≤ L. 注意:可能有多块稻田位于同一个坐标上. 我们计划建造一个米仓用于储存尽可能多的稻米.和稻田一样,米仓将建在米道上,其坐标也是一个 1 到 L 之间的整数(含 1 和 L). 这个米

[POJ3061]Subsequence(二分,前缀和)

题目链接:http://poj.org/problem?id=3061 题意:给一个长为n的数列和整数s,求一个连续的子序列,使得这个子序列长度最短并且不小于这个整数s. 统计[1~i]的子序列和sum(i),(sum(0)=0).然后求一个区间[i,j]的和即为sum(j)-sum(i-1) (i > 0). 由于给定序列没有负数,因此sum是个严格不减的序列. 转换成一个求最大值最小的问题,可以二分枚举序列长度,在前缀和上计算子序列[i-1,i+m-1]的和.如果存在一个满足子序列和≥s的,

二分 + 预处理前缀后缀 技巧题

You are given two strings a and b. You have to remove the minimum possible number of consecutive (standing one after another) characters from string b in such a way that it becomes a subsequence of string a. It can happen that you will not need to re

hdu 6406 Taotao Picks Apples (2018 Multi-University Training Contest 8 1010)(二分,前缀和)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6406 思路: 暴力,预处理三个前缀和:[1,n]桃子会被摘掉,1到当前点的最大值,1到当前点被摘掉的桃子的数量,然后我们枚举修改p点造成的所有影响,: 1,假如新输入的点比原先的点的值更大,那么我们对修改后p这个点的值和[1,p-1]的最大值关系进行分析,也就是分析前半段的影响:(1)如果p点大于1-p-1的最大值的时候我们直接利用前缀和O(1)得到[1,p-1]有多少个桃子被摘掉,然后加上当前这个.(

SUOI07 区间平均++ (二分答案+前缀和)

https://www.vijos.org/d/SUOI/p/59dc5af7d3d8a1361ae62b97 二分一个答案,然后做一做前缀和,用满足区间大小的最小值减一减,判断答案合不合法 然而还要输出一个最小的区间 太毒瘤了 但其实最后答案中最小区间的端点就只能是刚才做的那个最小值,因为如果不是最小值,那这个答案一定不是最优的 然后再随便对比一下就完事了 (感觉什么都没说清,看代码吧代码好看代码也不好看) 1 #include<bits/stdc++.h> 2 #define pa pai

[CQOI2009] 中位数 (前缀和)

[CQOI2009] 中位数 题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. 输入输出格式 输入格式: 第一行为两个正整数n和b,第二行为1~n的排列. [数据规模] 对于30%的数据中,满足n≤100: 对于60%的数据中,满足n≤1000: 对于100%的数据中,满足n≤100000,1≤b≤n. 输出格式: 输出一个整数,即中位数为b的连续子序列个数. 输入输出样例 输入样例#1: 7 4 5 7 2

EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)

题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这 n 个点的权值从小到大排序后,排在位置 ⌊n2⌋+1 上的权值. 思路(官方题解): 考虑二分答案,我们需要验证路径最大的中位数是否 ≥mid . 我们把所有的点权做 −1/1 变换,即 ≥mid 的点权变为 1 ,否则变为 −1 . 根据题面路径中位数的定义,我们可以发现,如果这条路径的中位数 ≥