BZOJ 2600 IOI2011 ricehub 中位数

题目大意:给定一条道路上的n个稻田,要求建一个粮仓,并且选定一些稻田进行运输,这些稻田到粮仓的距离之和不能超过B,求最多能选择多少个稻田

维护一个队列,头指针从前到后扫一遍

如果发现尾指针到头指针这段稻田的中位数上建一个粮仓时距离之和超过了B,就调整尾指针

对距离维护一个前缀和 每次取中位数之后可以O(1)计算距离和

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
int n,length,ans,a[M];
long long limit,sum[M];
bool Check(int l,int r)
{
	int mid=l+( (r-l+1)>>1 );
	long long sum1=(long long)(mid-l)*a[mid]-(sum[mid]-sum[l]);
	long long sum2=(sum[r]-sum[mid])-(long long)(r-mid)*a[mid];
	return sum1+sum2>limit;
}
int main()
{
	int i,j;
	cin>>n>>length>>limit;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		sum[i]=sum[i-1]+a[i];
	}
	for(j=0,i=1;i<=n;i++)
	{
		while( Check(j,i) )
			++j;
		ans=max(ans,i-j);
	}
	cout<<ans<<endl;
	return 0;
}
时间: 2025-01-02 16:58:03

BZOJ 2600 IOI2011 ricehub 中位数的相关文章

BZOJ 2600: [Ioi2011]ricehub

2600: [Ioi2011]ricehub Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 628  Solved: 325[Submit][Status][Discuss] Description 乡间有一条笔直而长的路称为“米道”.沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ≤ i <R,稻田 i 的坐标 X[i]满足 1 ≤ X[0] ≤ ...

bzoj 2600 ricehub

2600: [Ioi2011]ricehub Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 783  Solved: 417[Submit][Status][Discuss] Description 乡间有一条笔直而长的路称为"米道".沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ≤ i <R,稻田 i 的坐标 X[i]满足 1 ≤ X[

[Ioi2011]ricehub

2600: [Ioi2011]ricehub Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 乡间有一条笔直而长的路称为“米道”.沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ≤ i <R,稻田 i 的坐标 X[i]满足 1 ≤ X[0] ≤ ... ≤ X[R-1] ≤ L. 注意:可能有多块稻

【BZOJ2600】[Ioi2011]ricehub 双指针法

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

BZOJ 2600 IOI 2011 ricehub 二分

题目大意:给出粮食的位置,给出初始的钱数,问粮仓设在哪里会让收到的粮食最多.粮食运到粮仓需要花费|x - x'|的费用. 思路:看到L和B的范围都大的惊人,只能从R来下手.能不能从每个粮食的位置入手来搞点什么. 首先要想收购的尽量多,收购的粮食应该是一段连续的区间.对于每个粮食的位置,以这个粮食的位置为起点所能够收购到的粮食是单调的.这个就可以二分来确定了.一段区间内到达所有点最近的点是中位数,所以就可以O(1)判断了. (这真的是IOI题么.. CODE: #include <cstdio>

BZOJ 2599: [IOI2011]Race( 点分治 )

数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新CNT数组和答案. ------------------------------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; typ

【BZOJ 1303】 [CQOI2009]中位数图

1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1452  Solved: 951 [Submit][Status] Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数. Sample

bzoj2600 [Ioi2011]ricehub

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

BZOJ 1303 CQOI 2009 中位数图 模拟

题目大意:给出一个1~n的排列,问这其中的中位数为k的子序列的数量是多少. 思路:要想让k为中位数,一定要让它出现在这个序列中所以就以这个数为中心向两边拓展.想让一个数成为中位数,那么这个序列中出现的小于它的数一定要等于大于它的数.考虑到这个数左右都有可能有数字,那么就可以表示成:前多+后多=前少+后少,也就是前多-前少=后少-后多.之后就用个数组随意统计一下就行了. CODE: #include <cstdio> #include <cstring> #include <i