NOIP2011 聪明的质监员(二分)

由于我们并不清楚要求的W的值,但是我们知道W的值不超过矿石中价值最大的,如果W大于了矿石中价值最大的,那么Y的值为0,无法达到最优解。

因此,很容易就能想到在确定W的值要用二分的方法。

在分析这道题的时候,我们很容易知道Y的值是满足单调性的,当W的值越大,Y的值越小,因为W越大,能够选的矿石就越少。

所以我们把得到的Y值作为判断条件,如果Y比S小,就说明检验值了,而W取大了。每次更改W的同时给ans取最小值。

那么Y又应该怎么求出呢?题目中n,m最大有2*10^5,如果暴搜肯定超时,因此我们需要在枚举W的时候预处理。遍历w数组,保存满足条件的v和个数的前缀和。然后再遍历一遍要求的区间,即sum += ( cnt[R[i]] - cnt[L[i]-1] )*( sumv[R[i]] - sumv[L[i]] ) 之后,总的时间复杂度就从O(m*n*log(maxw))变成了O((m+n)*log(maxw))

注意此题要开long long保存

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 200005
#define LL long long
using namespace std;
LL n,m;
LL s;
LL sum;
LL w[MAXN],v[MAXN];
LL cnt[MAXN],sumv[MAXN];//保存前缀和
LL ops[MAXN][2];
void pre(int limit)//limit为当前枚举的W
{
	memset(cnt,0,sizeof cnt);
	memset(sumv,0,sizeof sumv);
	sum = 0;
	for(int i = 1; i <= n; i++)
	{
		cnt[i] = cnt[i-1];
		sumv[i] = sumv[i-1];
		if(w[i] >= limit)
		{
			cnt[i]++;
			sumv[i] += v[i];
		}
	}
	for(int i = 1; i <= m; i++)
		sum += (cnt[ops[i][1]] - cnt[ops[i][0]-1])*(sumv[ops[i][1]] - sumv[ops[i][0]-1]);
}
LL myabs(LL x)
{
	return x>0?x:-x;
}
int main()
{
	//freopen("qc14.in","r",stdin);
	//freopen("qc.out","w",stdout);
	LL L = 1,R = 0;
	scanf("%lld%lld%lld",&n,&m,&s);
	for(int i = 1; i <= n; i++)
	{
		scanf("%lld%lld",&w[i],&v[i]);
		if(w[i] > R)
			R = w[i];
	}
	for(int i = 1; i <= m; i++)
	{
		scanf("%lld%lld",&ops[i][0],&ops[i][1]);
	}
	LL mid;
	LL ans = 100000000000000LL;
	while(L <= R)
	{
		mid = (L+R)/2;
		pre(mid);//预处理,并求满足当前W的检验值
		if(ans > myabs(s-sum))
			ans = myabs(s-sum);
		if(sum < s)
			R = mid-1;
		if(sum > s)
			L = mid+1;
		if(sum == s)
			break;
	}
	printf("%lld\n",ans);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 15:11:39

NOIP2011 聪明的质监员(二分)的相关文章

NOIP2011聪明的质监员题解

631. [NOIP2011] 聪明的质监员 ★★   输入文件:qc.in   输出文件:qc.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是: 1. 给定 m个区间[Li,Ri]: 2. 选出一个参数W: 3. 对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi: Yi=∑j1×∑jvj, j∈[

noip2011 聪明的质监员

P1314 聪明的质监员 322通过 1.5K提交 题目提供者该用户不存在 标签二分2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[Li,Ri]: 2 .选出一个参数 W: 3 .对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi: 这批矿产的检验结果Y 为各个区间的

$Noip2011/Luogu1314$ 聪明的质监员 二分+巧妙前缀和

$Luogu$ $Sol$ 首先$W$一定是某个$w_i$.于是一种暴力方法就出炉了,枚举$W$再计算. 注意到,满足$S-Y$的绝对值最小的$Y$只可能是两种,一种是$<S$的最大的$Y$,一种是$>S$的最小的$Y$.那就分别求出来叭.分别求的时候这个$W$的值是可以二分的.但是这样并不能$A$掉这题,因为$check$的复杂度仍然是$O(NM)$的.看了题解之后发现$check$可以用前缀和吖,觉得很巧妙$qwq$.这样下来$check()$的复杂度变成$O(N+M).$ $Code$

P1314 聪明的质监员[二分答案]

题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 nn 个矿石,从 11到nn 逐一编号,每个矿石都有自己的重量 w_i*w**i* 以及价值v_i*v**i* .检验矿产的流程是: 1 .给定mm个区间[L_i,R_i][Li,Ri]: 2 .选出一个参数WW: 3 .对于一个区间[L_i,R_i][Li,Ri],计算矿石在这个区间上的检验值Y_i*Y**i*: 这批矿产的检验结果YY 为各个区间的检验值之和.即:Y_1+Y_2...+Y_mY1+Y2...+*Y**

[NOIP2011]聪明的质监员 题解

题目大意: 额--貌似蛮清晰的,就不赘述了. 思路: 首先不难发现M越大Y越小,因此可以二分答案(方向不要弄错),二分出最小的不小于S的Y即可.而计算Y时可用前缀和O(n+m)求得.两种边界情况也要考虑一下(同时long long不要少开). 代码: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define ll long long 5 const int M=200008; 6 int n,m

vijos1740 聪明的质监员 (二分、区间求和)

http://www.rqnoj.cn/problem/657 https://www.vijos.org/p/1740 P1740聪明的质检员 请登录后递交 标签:NOIP提高组2011[显示标签] 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是: 1.给定m个区间[Li,Ri]: 2.选出一个参数W: 3.对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi: Yi = ∑1

NOIP2011提高组 聪明的质监员 -SilverN

题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[Li,Ri]: 2 .选出一个参数 W: 3 .对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi: 这批矿产的检验结果Y 为各个区间的检验值之和.即:Y1+Y2...+Ym 若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产.小T 不想费时间去检验另一批矿产,所以他想通

P1314 聪明的质监员

P1314 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[Li,Ri]: 2 .选出一个参数 W: 3 .对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi: 这批矿产的检验结果Y 为各个区间的检验值之和.即:Y1+Y2...+Ym 若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产.小T 不想费时间去

[Codevs] 1138 聪明的质监员

1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n 个矿石,从1到n 逐一编号,每个矿石都有自己的重量wi 以及价值vi.检验矿产的流程是:见图 若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产.小T不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近标准值