[NOIP2011] 聪明的质检员(二分答案)
题目描述
小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi 。检验矿产的流程是:
1 、给定m 个区间[Li,Ri];
2 、选出一个参数 W;
3 、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:

这批矿产的检验结果Y 为各个区间的检验值之和。即:Y1+Y2...+Ym
若这批矿产的检验结果与所给标准值S 相差太多,就需要再去检验另一批矿产。小T
不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近
标准值S,即使得S-Y 的绝对值最小。请你帮忙求出这个最小值。
输入输出格式
输入格式:
输入文件qc.in 。
第一行包含三个整数n,m,S,分别表示矿石的个数、区间的个数和标准值。
接下来的n 行,每行2个整数,中间用空格隔开,第i+1 行表示 i 号矿石的重量 wi 和价值vi。
接下来的m 行,表示区间,每行2 个整数,中间用空格隔开,第i+n+1 行表示区间[Li,Ri]的两个端点Li 和Ri。注意:不同区间可能重合或相互重叠
输出格式:
输出文件名为qc.out。
输出只有一行,包含一个整数,表示所求的最小值。
输入输出样例
5 3 15
1 5
2 5
3 5
4 5
5 5
1 5
2 4
3 3
10
说明
【输入输出样例说明】
当W 选4 的时候,三个区间上检验值分别为 20、5 、0 ,这批矿产的检验结果为 25,此
时与标准值S 相差最小为10。
【数据范围】
对于10% 的数据,有 1 ≤n ,m≤10;
对于30% 的数据,有 1 ≤n ,m≤500 ;
对于50% 的数据,有 1 ≤n ,m≤5,000;
对于70% 的数据,有 1 ≤n ,m≤10,000 ;
对于100%的数据,有 1 ≤n ,m≤200,000,0 < wi, vi≤10^6,0 < S≤10^12,1 ≤Li ≤Ri ≤n 。
- NOIP2011 day2t2,不是很难
- 通过观察数据范围可知,本题要采用O(n)或O(nlogn)的算法,但O(n)显然不现实,所以要采用O(nlogn)的方法
- 既然已经确定了算法的时间复杂度范围,我们就会很容易想到二分答案的方法。
- 通过题意可知答案只与参数w有关,所以我们才用二分w的方法寻找最优答案。
- 二分的左右界分别为矿石的最小质量和最大质量(否则无意义)。
- 对于每个二分出的w,利用前缀和算出符合质量条件的矿石并记录这些矿石的价值和,生成这些矿石的检测结果。
- 利用结果更新答案:如果结果等于标准值则答案为0;若结果小于标准值则用两个数的差的绝对值更新答案,并二分左区间(因为结果随w单调递减),大于则同理。
- 要注意本题的数据范围,要开64位。
- 时间复杂度O((n+m)*log(wimax))。
- 期望得分100分。
var
n,m,i,j,k :longint;
s,l,r,ans,mid,p :int64;
tot,sum,v,w :Array[..] of int64;
ll,rr :array[..] of longint; function find(ww:int64):int64;
var
i,j :longint;
answ :int64;
begin
fillchar(tot,sizeof(tot),);
fillchar(sum,sizeof(sum),);
for i:= to n do
begin
if (w[i]>=ww) then
begin
tot[i]:=tot[i-]+;
sum[i]:=sum[i-]+v[i];
end else
begin
tot[i]:=tot[i-];
sum[i]:=sum[i-];
end;
end;
answ:=;
for i:= to m do answ:=answ+(tot[rr[i]]-tot[ll[i]-])*(sum[rr[i]]-sum[ll[i]-]);
exit(answ);
end; begin
read(n,m,s);
l:=maxlongint;
r:=;
for i:= to n do
begin
read(w[i],v[i]);
if w[i]<l then l:=w[i];
if w[i]>r then r:=w[i];
end;
for i:= to m do read(ll[i],rr[i]);
ans:=;
while (l<=r) do
begin
mid:=(l+r)>>;
p:=find(mid);
if p=s then
begin
ans:=;
break;
end;
if (p<s) then
begin
if s-p<ans then ans:=s-p;
r:=mid-;
end else
begin
if p-s<ans then ans:=p-s;
l:=mid+;
end;
end;
writeln(ans);
end.
[NOIP2011] 聪明的质检员(二分答案)的更多相关文章
- [NOIP2011]聪明的质检员
[问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有$n$个矿石,从 1 到$n$逐一编号,每个矿石都有自己的重量$w_i$以及价值$v_i$.检验矿产的流程是: 1. 给 ...
- P1314 聪明的质监员 二分答案
这个题我第一反应是线段树(雾),然后看了一眼题解之后就后悔了...前缀和...然后二分答案,然后就没有然后了. 题干: 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 nnn 个矿石 ...
- NOIP2015聪明的质检员[二分 | 预处理]
背景 NOIP2011 day2 第二题 描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿 ...
- Luogu P1314 聪明的质监员 二分答案
题目链接 Solution 这个范围不是二分就是结论题就是数学题... 然后再看一会差不多就可以看出来有单调性所以就可以确定二分的解法了 二分那个$W$,用前缀和$O(n+m)$的时间来求出对答案的贡 ...
- [NOIP2011] 聪明的质监员 二分+前缀和
考试的时候打的二分但没有用前缀和维护.但是有个小细节手误打错了结果挂掉了. 绝对值的话可能会想到三分,但是注意到w增大的时候y是减小的,所以单调性很明显,用二分就可以.但注意一个问题,就是二分最后的结 ...
- Luogu 1314 【NOIP2011】聪明的质检员 (二分)
Luogu 1314 [NOIP2011]聪明的质检员 (二分) Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有 ...
- [NOIP 2011] 聪明的质检员
聪明的质检员 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是:1.给定m个区间[Li,Ri ...
- NC16597 [NOIP2011]聪明的质监员
NC16597 [NOIP2011]聪明的质监员 题目 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿 ...
- NOIP2011聪明的质监员题解
631. [NOIP2011] 聪明的质监员 ★★ 输入文件:qc.in 输出文件:qc.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 小 T 是一名质量监督 ...
随机推荐
- c# 第一个实例 通哥
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- AngularJs的UI组件ui-Bootstrap分享(一)
最近几个月学习了AngularJs和扩展的UI组件,并在公司小组内做了一次分享交流,感觉很有收获,在此记录下个人的学习心得. 目录: AngularJs的UI组件ui-Bootstrap分享(一) A ...
- Windows Server 2003 IIS6.0+PHP5(FastCGI)+MySQL5环境搭建教程
准备篇 一.环境说明: 操作系统:Windows Server 2003 SP2 32位 PHP版本:php 5.3.14(我用的php 5.3.10安装版) MySQL版本:MySQL5.5.25 ...
- 《1---关于解决MySQL在控制台插入中文乱码问题》
说明:以下所有操作都是基于我个人的电脑及示例,读者可以参考我这个解决过程,去解决自己的问题,如有其它疑问,欢迎留言交流. 首先来看看我遇到的问题: [1]查看数据库: [2]使用test数据库: [3 ...
- C#为什么不采用多继承:
C#为什么不采用多继承: 1.继承从来未被广泛使用. 2.多继承带来的问题往往多于其解决的问题. 3.多继承会引起潜在的歧义. C#核心编程
- 379. Design Phone Directory
379. Design Phone Directory Design a Phone Directory which supports the following operations: get: P ...
- TCP/UDP网络性能测试工具 - Netperf (zz) ..网络测试工具
在构建或管理一个网络系统时,我们更多的是关心网络的可用性,即网络是否连通,而对于其整体的性能往往考虑不多. 除了netperf以外. 还有很多其它的网络性能测试工具. 如db, ...
- Visual C# 代码段
代码段是现成的代码段,您可以快速将其插入到您的代码中. 例如,for 代码段创建一个空的 for 循环. 有些代码段为外侧代码段,这些代码段允许您先选择代码行,然后选择要并入选定代码行的代码段. 例如 ...
- Oracel查询根据部分字段去重复
一般一个表的id是唯一的,如果除去id则会有重复数据,有时做项目时查询要求根据某几个字段去掉重复记录,并且查询保留id 以下是Oracel查询时根据部分字段去重复,例如,查询的字段包括id,Sys,C ...
- 用VC调用EXCEL简单代码(转载自越长大越孤单,觉得很好)
首先在stdafx.h里加入对IDispatch接口提供支持的头文件: #include <afxDisp.h> 再在应用程序类的InitInstance()函数里加入: AfxOleIn ...