更好的阅读体验

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. oracle之新建用户与授权

    1.登录,口令为Oracle12c 2.新建用户 3.口令自己设置 4.按下图给角色授权,点击用用 5.登录刚刚创建的用户

  2. Oracle VM VirtualBOX桥接网卡

    1.在VirtualBOX设置中的网络菜单,连接方式选择桥接网卡 2.启动系统,设置静态IP sudo vim /etc/network/interfaces auto enp0s3         ...

  3. python服务端工程师就业面试指导☝☝☝

    python服务端工程师就业面试指导 由Python专业面试官打造的课,少之又少,专业代表着经验,代表着对考察点的通透理解,更代表着对你负责 第1章 Python工程师offer直通车(视频+教辅文档 ...

  4. Github 高级搜索功能

    参考文章链接:https://zhuanlan.zhihu.com/p/55294261 GitHub 提供高级搜索方式. 一.明确搜索仓库标题.仓库描述.README 1.只想查找仓库名称包含XX的 ...

  5. PowerShell渗透--Empire(三)

    会话注入 我们可以使用usemodule management/psinject模块来进程注入,获取权限 设置下Listeners和ProcID这2个参数,这里的ProcID就是之前的CMD的pid, ...

  6. spark cdh5编译安装[spark-1.0.2 hadoop2.3.0 cdh5.1.0]

    前提你得安装有Hadoop 我的版本hadoop2.3-cdh5.1.0 1.下载maven包 2.配置M2_HOME环境变量,配置maven 的bin目录到path路径 3.export MAVEN ...

  7. MYSQL DATE_FORMAT参数列表及用法

    MYSQL DATE_FORMAT参数列表及用法 主要涉及用法 DATE_SUB(DATE, INTERVAL EXPR TYPE) DATE_FORMAT(DATE,FORMAT) REPLACE( ...

  8. Java基础(38)AbstractMap类

    AbstractMap类的子类有HashMap(其子类是LinkedHashMap).TreeMap.EnumMap.WeakHashMap和IdentityHashMap. 1.HashMap (1 ...

  9. 设计模式(二十三)Interpreter模式

    在Interpreter模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的“迷你程序”把具体的问题表述出来.迷你程序是无法单独工作的,还需要用java语言编写一个负责 ...

  10. APP打包设置程序版本号

    正确设置方式是: 注意,以下修改不会起作用<manifestxmlns:android="http://schemas.android.com/apk/res/android" ...