更好的阅读体验

Portal

Portal1: Luogu

Portal2: LibreOJ

Portal3: Vijos

Description

小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\)以及价值\(v_i\)。检验矿产的流程是:

  1. 给定\(m\)个区间\([L_i, R_i]\);

  2. 选出一个参数\(W\);

  3. 对于一个区间\([L_i, R_i]\),计算矿石在这个区间上的检验值\(Y_i\):

$Y_i=\sum_j1 \times \sum_j{v_j},\ j\in[L_i, R_i]$ 且 $w_j\ge W,\ j$是矿石编号

这批矿产的检验结果\(Y\)为各个区间的检验值之和。即:\(Y_1 + Y_2 + \cdots +Y_m\)。

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

Input

输入第一行包含三个整数\(n\),\(m\),\(S\),分别表示矿石的个数、区间的个数和标准值;

接下来的\(n\)行,每行\(2\)个整数,中间用空格隔开,第\(i + 1\)行表示\(i\)号矿石的重量\(w_i\)和价值\(v_i\);

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

Output

一个整数,表示所求的最小值。

Sample Input

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

Sample Output

10

Sample Explain

当\(W\)选\(4\)的时候,三个区间上检验值分别为\(20, 5, 0\),这批矿产的检验结果为\(25\),此时与标准值\(S\)相差最小为\(10\)。

Hint

对于\(10\%\)的数据,有\(1 \le n, m \le 10\);

对于\(30\%\)的数据,有\(1 \le n, m \le 500\);

对于\(50\%\)的数据,有\(1 \le n, m \le 5,000\);

对于\(70\%\)的数据,有\(1 \le n, m \le 10,000\);

对于\(100\%\)的数据,有\(1 \le n, m \le 200,000 ,0 < w_i, v_i \le 10^6,0 < S \le 10^{12},1 \le L_i \le R_i \le n\)。

Solution

这道题直接在\([0, \max{w[i]}]\)二分枚举\(W\),对于每一个枚举出来的\(w\),暴力计算每一个区间的检验值和,这里使用前缀和优化。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std; typedef long long LL;
const LL INF = 0x7f7f7f7f7f7f7f7f7f7f;//把ans的初始值设大一点,否则会WA很多
const int MAXN = 200005;
int n, m, w[MAXN], v[MAXN], L[MAXN], R[MAXN];
LL S, l, r, mid, ans, sum1[MAXN], sum2[MAXN];//注意开long long
inline bool check(LL x) {
for (int i = 1; i <= n; i++)
if (x <= w[i]) {//如果符合要求的化
sum1[i] = sum1[i - 1] + 1;
sum2[i] = sum2[i - 1] + v[i];
} else {
sum1[i] = sum1[i - 1];
sum2[i] = sum2[i - 1];
}
LL s = 0;
for (int i = 1; i <= m; i++)
s += (sum2[R[i]] - sum2[L[i] - 1]) * (sum1[R[i]] - sum1[L[i] - 1]);//暴力计算每一个区间,累加起来
if (ans > fabs(s - S)) ans = fabs(s - S);//计算与标准值相差的最小值
if (S > s) return 1; else return 0;
}
int main() {
scanf("%d%d%lld", &n, &m, &S);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &w[i], &v[i]);
if (w[i] > r) r = w[i];//求区间的右边界(取w[i]的最大值)
}
for (int i = 1; i <= m; i++)
scanf("%d%d", &L[i], &R[i]);
r++;
l = 0;
ans = INF;
while (l < r) {
mid = l + r >> 1;//二分枚举
if (check(mid)) r = mid; else l = mid + 1;//如果大于标准值就往降低要求,否则就提高要求
}
printf("%lld\n", ans);
return 0;
}

Attachment

测试数据下载:https://www.lanzous.com/i527v3i

『题解』洛谷P1314 聪明的质监员的更多相关文章

  1. 洛谷P1314 聪明的质监员

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

  2. 洛谷P1314 聪明的质监员 题解

    题目 聪明的质监员 题解 这道题和之前Sabotage G的那道题类似,都是用二分答案求解(这道题还要简单一些,不需要用数学推导二分条件,只需简单判断一下即可). 同时为了降低复杂度,肯定不能用暴力求 ...

  3. 洛谷 P1314 聪明的质监员 —— 二分

    题目:https://www.luogu.org/problemnew/show/P1314 显然就是二分那个标准: 当然不能每个区间从头到尾算答案,所以要先算出每个位置被算了几次: 不知为何自己第一 ...

  4. [NOIP2011] 提高组 洛谷P1314 聪明的质监员

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

  5. 洛谷 P1314 聪明的质监员【二分+前缀和】

    真是zz, 题目很显然是二分W,然后判断,我一开始是用线段树维护当前w[i]>W的个数和v(公式就是区间满足要求的个数*满足要求的v的和),然后T成70 后来想到树状数组差分常数或许会小,于是改 ...

  6. 洛谷——P1314 聪明的质监员

    https://www.luogu.org/problem/show?pid=1314 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每 ...

  7. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

  8. 『题解』洛谷P1993 小K的农场

    更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...

  9. 『题解』洛谷P2296 寻找道路

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...

随机推荐

  1. COGS 2089. 平凡的测试数据

    [题目描述] 树链剖分可以干什么? “可以支持在树中快速修改一个点信息,快速询问一条链信息” LCT可以干什么? “可以支持树链剖分支持的特性,并且支持快速链接两个棵树,或者断开某条边” 那我现在要出 ...

  2. ZGC介绍

    zgc是一款可拓展的低时延,为实现以下几个目标而诞生的垃圾回收器: 停顿时间不超过10ms 停顿时间不会导致堆大小增长 堆大小范围可支持几G到几T 再看一下zgc的标签: region-based ( ...

  3. [LUOGU1437] 敲砖块

    题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 33 33 7 ...

  4. libevent::事件

    /***************************************************************** 函数功能: 创建事件集 ********************* ...

  5. Java类型信息(RTTI和反射)

    要想在IT领域站得住脚,必须得不断地学习来强化自己,但是学过的技术不实践很容易便被遗忘,所以一直都打算开个博客,来记录自己学的知识,另外也可以分享给有需要的人! 最近在学习反射,为了更好地理解反射,就 ...

  6. Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2

    前后端分离后,维护接口文档基本上是必不可少的工作. 一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理想的状态,实际开发中却 ...

  7. 破解Android设备无法联调的谜题

    这篇文章要感谢来自知乎的小伙伴:子非鱼,他最近被一件事情困惑,那就是:Android手机无法联调了.在解决完他的疑问后,突然意识到,其实自己在前一段时间也曾遇到同样的问题,最后居然还怀疑是电脑和手机不 ...

  8. 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(一)

    MySQL的行(记录)的操作(一) 1. 增(insert) insert into 表名 value((字段1,字段2...); # 只能增加一行记录 insert into 表名 values(字 ...

  9. Java中的锁[原理、锁优化、CAS、AQS]

    1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新, ...

  10. 算法<初级> - 第一章 排序相关问题

    算法 - 第一章 时间复杂度: Big O 时间/空间复杂度计算一样,都是跟输入数据源的大小有关 n->∞ O(logn) 每次只使用数据源的一半,logn同理 最优解 先满足时间复杂度的情况最 ...