聪明的质检员

描述

小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi。检验矿产的流程是:
1、给定m个区间[Li,Ri];
2、选出一个参数W;
3、对于一个区间[Li,Ri],计算矿石在这个区间上的 检验值$Y_i$:
\[Y_i=(\sum_j {1}) \times(\sum_j v_j) ,j \in [L_i,R_i] \land \: w_i \geqslant W\]

其中 $j$ 为矿石编号

这批矿产的 检验结果Y 为各个区间的检验值之和 。即:

\[Y = \sum _{i=1} ^m Y_i\]

若这批矿产的 检验结果 与所给标准值S相差太多,就需要再去检验另一批矿产。小T不想费时间去检验另一批矿产,所以他想通过调整参数W的值,让 检验结果 尽可能的靠近标准值S,即使得 S-Y 的绝对值最小。请你帮忙求出这个最小值。

格式

输入格式

第一行包含三个整数n,m,S,分别表示矿石的个数、区间的个数和标准值。

接下来的n行,每行2个整数,中间用空格隔开,第i+1行表示i号矿石的重量wi和价值vi 。

接下来的m行,表示区间,每行2个整数,中间用空格隔开,第i+n+1行表示区间[Li,Ri]的两个端点Li和Ri。 注意:不同区间可能重合或相互重叠。

输出格式

输出只有一行,包含一个整数,表示所求的最小值。

样例1

样例输入1

5 3 15
1 5
2 5
3 5
4 5
5 5
1 5
2 4
3 3

样例输出1

10

限制

1s

提示

样例说明:当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。

首先我们注意到题目中的 $W$ 值越大, $Y$ 一定会越小. 这满足单调性, 所以可以考虑二分 $W$ 使其尽可能接近 $Y$ (考试的时候有人查答案的时候在运算时直接作了差, 然后就得套绝对值符号, 然后就只能三分最后被卡了233333)

(还记得我第一次学会二分答案的奇技淫巧还是在写CodeForces的Rating计算器的时候w)

然后就是如何在已知 $W$ 的情况下快速求出 $Y$ .

隔壁机房由于日常援疆然后无脑上树成功无故给复杂度加了个 $log$ 2333333

其实我们可以 $O(n)$ 预处理出前缀和, 然后 $O(1)$ 计算每个区间的查询. 前缀和要预处理两个, 分别是前 $i$ 个矿石中满足 $w_i \geq W$ 的矿石的价值和 $sum$ 以及前 $i$ 个矿石中满足 $w_i \geq W$ 的矿石个数. 然后就可以 $O(1)$ 响应每个区间查询辣w

单次计算一个 $W$ 值所对应的 $Y$ 的时间复杂度 $O(n+m)$. 总时间复杂度 $O(log(w_{max})\times (n+m))$

参考代码

GitHub

 #include <set>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXN=;
const long long INF=0x7FFFFFFFFFFFFFFFll; int n;
int m;
long long S;
int L[MAXN];
int R[MAXN];
long long maxw;
long long w[MAXN];
long long v[MAXN];
long long ans=INF;
long long sum[MAXN];
long long count[MAXN]; long long Y(int);
void Initialize(); int main(){
Initialize();
int l=;
int r=maxw;
while(l<=r){
int mid=(l+r)/;
long long tmp=Y(mid);
ans=std::min(ans,std::abs(tmp-S));
if(tmp<S)
r=mid-;
else
l=mid+;
}
printf("%lld\n",ans);
return ;
} long long Y(int W){
// fprintf(stderr, "W=%d\n", W);
long long ret=;
memset(sum,,sizeof(sum));
memset(count,,sizeof(count));
for(int i=;i<=n;i++){
sum[i]=sum[i-];
count[i]=count[i-];
if(w[i]>=W){
sum[i]+=v[i];
count[i]++;
}
// fprintf(stderr, "sum[%d]=%lld ,cnt=%lld\n", i,sum[i],count[i]);
}
for(int i=;i<m;i++){
ret+=(sum[R[i]]-sum[L[i]-])*(count[R[i]]-count[L[i]-]);
}
// fprintf(stderr, "ret=%lld\n", ret);
return ret;
} void Initialize(){
freopen("qc.in","r",stdin);
freopen("qc.out","w",stdout);
scanf("%d%d%lld",&n,&m,&S);
for(int i=;i<=n;i++){
scanf("%lld%lld",w+i,v+i);
maxw=std::max(maxw,w[i]);
}
for(int i=;i<m;i++){
scanf("%d%d",L+i,R+i);
}
}

Backup

[NOIP 2011] 聪明的质检员的更多相关文章

  1. [NOIP 2011]聪明的质监员

    聪明的质监员 题目 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是: 1. 给定 m个区间[ ...

  2. Luogu 1314 【NOIP2011】聪明的质检员 (二分)

    Luogu 1314 [NOIP2011]聪明的质检员 (二分) Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有 ...

  3. [NOIP2011] 聪明的质检员(二分答案)

    题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[L ...

  4. NOIP2015聪明的质检员[二分 | 预处理]

    背景 NOIP2011 day2 第二题 描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿 ...

  5. Vijos P1740聪明的质检员

    题目 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是:1.给定m个区间[Li,Ri]:2. ...

  6. 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)

    ###一道二分答案加前缀和### 题目中已经暗示的很明显了 "尽可能靠近" " 最小值" 本题的主要坑点在于 long long 的使用 ##abs函数不支持l ...

  7. luogu 1314 聪明的质检员

    二分答案的边界问题还是要注意 double挨着,int+1-1, 此题用到long long,所以初始化ans要足够大,前缀和优化 依然根据check答案大小左右mid,虽然有s,但是有了+1-1加持 ...

  8. [NOIP2011]聪明的质检员

    [问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有$n$个矿石,从 1 到$n$逐一编号,每个矿石都有自己的重量$w_i$以及价值$v_i$.检验矿产的流程是: 1. 给 ...

  9. vijos P1740 聪明的质检员

    题目链接:传送门 题目大意:给你n个物品,每件物品有重量 W 和价值 V,给m个区间,和一个标准值.(n,m最大200000) 要求找到一个值x,使得m个所有区间的权值和与标准值的差的绝对值最小.单个 ...

随机推荐

  1. SQL常用性能相关脚本

    --调试语句性能前记得清空执行计划 每次执行需优化SQL前,带上清除缓存的设置SQL. 平常在进行SQL Server性能优化时,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计 ...

  2. weblogic 异常常见处理方法

    1.系统日志 通过分析weblogic的系统日志及应用程序出错的地方,可能找到异常的原因. 2. 数据库连接 如果用户访问系统过慢,且连接池已经占满而weblogic的线程数量很少,就要查看应用是否没 ...

  3. [PY3]——内置数据结构(6)——集合及其常用操作

    集合及其常用操作Xmind图          集合的定义 # set( ) # {0,1,2} //注意不能用空的大括号来定义集合 # set(可迭代对象) In [1]: s=set();type ...

  4. [Mysql]——备份、还原、表的导入导出

    备份 1. mysqldump mysqldump备份生成的是个文本文件,可以打开了解查看. Methods-1 备份单个数据库或其中的几个表# mysqldump -u username -p'pa ...

  5. $emit子组件传出多个参数,如何在父组件中在接收所有参数的同时添加自定义参数

    很多时候用$emit携带参数传出事件,并且又需要在父组件中使用自定义参数时,这时我们就无法接受到子组件传出的参数了.    找到了两种方法可以同时添加自定义参数的方法. 方法一:子组件传出单个参数时 ...

  6. JAVA-1NIO概述

    注意: 转载自并发编程网 – ifeve.com本文链接地址: Java NIO系列教程(一) Java NIO 概述 JAVA-1NIO概述 Java NIO 由以下几个核心部分组成: Channe ...

  7. [转]MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction

    本文参考自下面文章整理 MVC Razor模板引擎 @RenderBody.@RenderPage.@RenderSection及Html.RenderPartial.Html.RenderActio ...

  8. 仿淘宝头像上传功能(三)——兼容 IE6 浏览器。

    前两篇目录: 仿淘宝头像上传功能(一)——前端篇. 仿淘宝头像上传功能(二)——程序篇. 仿淘宝头像上传功能(三)——兼容 IE6 浏览器 之前的这两篇虽然实现了功能,但不兼容低版本浏览器,而且有些浏 ...

  9. lodop判断是否打印成功

    需要引用js <script src="js/jquery-3.3.1.js"></script> <script src="js/Lodo ...

  10. JAVA基础之——String、StringBuilder、StringBuffer区别和使用场景

    本文主要讲解String.StringBuilder.StringBuffer区别和应用场景 本文以jdk1.8为例 1 String 操作过程:每次赋值时新建一个String对象. 2 String ...