P1314 [NOIP2011 提高组] 聪明的质监员

题意

题目描述

  • 给定\(n\)个物品,给定每个物品的 重量 \(w_i\) 和 价值 \(v_i\)
  • 给定一个标准值 \(s\) 以及一个参数 \(w\)
  • 质检员每次会抽取\(m\)个区间,每次的抽检结果为 \(y = \sum_{l_i}^{r_i} (w_i \ge w) · \sum_{l_i}^{r_i} v_i\)
  • 求出 \(\min{\mid{y - s}\mid}\)

数据范围

\(1 \le n,m \le 2^5\), \(0 < w_i, v_i \le 10^6\) \(0 < s \le 10^12\), \(1 \le l_i \le r_i \le n\)

SOLUTION

当 \(y > s\) 的时候, \(y - s > 0\) 当 \(y < s\) 的时候, \(y - s < 0\) 我们想让 \(y\) 尽可能的逼近 \(s\) 对于参数\(w\),当\(w\)越大,\(y\)越小

因此本题具有单调性。 考虑二分\(w\) 使得 \(y\) 尽可能的逼近\(s\) 即可

AC_CODE_1

#include <bits/stdc++.h>
#define LL long long using namespace std; const int N = 2e5 + 10; int n, m, l = INF, r = -INF;
LL s; // 不开 long long 见祖宗 | =^_^= |
int L[N], R[N];
int w[N], v[N];
LL p1[N], p2[N]; LL chk(int x) {
for(int i = 1; i <= n; i ++ ) {
p1[i] = p1[i - 1]; p2[i] = p2[i - 1];
if(w[i] >= x) {
p1[i] += v[i];
p2[i] ++;
}
}
// printf("\n%d\n", x);
LL ANS = 0;
rep(i, 1, m) {
// printf("> %d %d %lld %lld\n",L[i], R[i], (p1[R[i]] - p1[L[i] - 1]) , (p2[R[i]] - p2[L[i] - 1]));
ANS += (p1[R[i]] - p1[L[i] - 1]) * (p2[R[i]] - p2[L[i] - 1]);
}
return ANS; } inline void solve() { read(n); read(m); read(s);
rep(i, 1, n) {
read(w[i]); read(v[i]);
l = min(l, w[i]); r = max(r, w[i]);
}
rep(i, 1, m) {
read(L[i]); read(R[i]);
}
l --, r ++;
LL ans = INFF;
while(l <= r) { // 由于 l = mid + 1, r = mid - 1 因此while循环里面的条件应该是 l <= r
int mid = l + r >> 1;
LL res = chk(mid);
if(res >= s) l = mid + 1; // 如果结果 y > s 我们就让 w 大一点 这样 y就会小一点更逼近 s
else r = mid - 1; //同理
ans = min(ans, abs(res - s));
// printf("> %d %lld\n", mid, res);
}
printf("%lld\n", ans);
}
signed main()
{
// freopen("in.txt", "r", stdin);
solve();
return 0;
}

AC_CODE_2

//倍增写法
#include <cstdio>
#include <iostream> #define LL long long const int N = 2e5 + 10; int n, m, ans = 1; LL s;
int w[N], v[N], L[N], R[N]; LL s1[N], s2[N]; inline LL chk(int W) {
for(int i = 1; i <= n; ++ i) {
s1[i] = w[i] >= W ? s1[i - 1] + 1 : s1[i - 1];
s2[i] = w[i] >= W ? s2[i - 1] + v[i] : s2[i - 1];
}
LL res = 0;
for(int i = 1; i <= m; ++ i ) {
res += (s1[R[i]] - s1[L[i] - 1]) * (s2[R[i]] - s2[L[i] - 1]);
}
return res;
} int main() {
scanf("%d%d%lld", &n, &m, &s);
for(int i = 1; i <= n; i ++ ) scanf("%d%d", &w[i], &v[i]);
for(int i = 1; i <= m; i ++ ) scanf("%d%d", &L[i], &R[i]);
for(int i = 17; i >= 0; -- i) {
ans += chk(ans + (1 << i)) >= s ? (1 << i) : 0;
}
printf("%lld\n", std::min(chk(ans) - s, s - chk(ans + 1))); return 0;
}

Luogu P1314 [NOIP2011 提高组] 聪明的质监员的更多相关文章

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

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

  2. Noip2011提高组 聪明的质监员

    题目传送门 讲真,既然质监员这么聪明,为什么要让我们帮他设计程序? 所以还是叫ZZ的质检员吧 其实,我最想说的,不是这个题,而是这个\(\Sigma\)(一见 \(\Sigma\) 就懵逼系列) 这个 ...

  3. NOIP2011 提高组 聪明的质监员(二分+前缀和)

    看到这道题,应该都能想到用二分,那问题是怎么去判定呢? 我们考虑用前缀和(a1统计w,a2统计v),枚举每个矿石,,当前判定的值是x,如果该矿石的w>=x,a1[i]=a1[i-1]+1,a2[ ...

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

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

  5. Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组

    1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...

  6. 【洛谷P1314】[NOIP2011]聪明的质监员

    聪明的质监员 题目链接:https://www.luogu.org/problemnew/show/P1314 Y(W)随W的值增大而减小 二分W的值,找到最小的W使得Y(W)>S: 比较Y(W ...

  7. 聪明的质监员 2011年NOIP全国联赛提高组(二分+前缀和)

    聪明的质监员 2011年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 小 T 是一名质量监督员, ...

  8. luogu P1314 聪明的质监员 x

    P1314 聪明的质监员(至于为什么选择这个题目,可能是我觉得比较好玩呗) 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自 ...

  9. Luogu P1314 聪明的质监员(二分+前缀和)

    P1314 聪明的质监员 题意 题目描述 小\(T\)是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\) ...

随机推荐

  1. Doing Homework(hdu)1074

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. golang切片的一些自问自答

    你好,我是轩脉刃.这篇是关于go切片的一些问题和回答. go的切片基本上是代码中使用最多的一种数据结构了,使用这种数据结构有哪些要注意的点,这个是非常必要了解的东西.基本上,以前写的一篇博客 http ...

  3. Inverse/Implicit Function Theorem

    目录 4.1 The Inverse Function Theorem The Implicit Function Theorem 4.3 Curves and Surfaces 4.4 The Mo ...

  4. [linux]ubuntu18.04 屏幕分辨率不适应问题

    今天换了新显示器,发现更大的屏幕不适应原有的屏幕分辨率,看起来特别变扭. 在设置处查看最高分辨率仅为1024*748,没有与屏幕相适应的1920*1080(16:9). 解决方式: 1. 终端输入命令 ...

  5. CapstoneCS5212替代RTD2166|DP转VGA转换电路设计方法|CS5212替代方案

    Capstone CS5212适用于设计DP转VGA转换电路,主要用在嵌入式单片机基于工业机或者INTEL X86主板上面,也适用于多个电子配件市场和显示器应用程序,如笔记本电脑.主板.台式机.适配器 ...

  6. CS5211替代CH7511B|DP转LVDS控制板|替代CH7511B设计电路方案

    CS5211性能和参数可以替代CH7511B,PS8622,PS8625,LT7211等方案,用于设计DP转LVDS转换器,DP转LVDS控制板,DP转LVDS转接板等产品设计. CS5211是一个e ...

  7. HTML网页设计基础笔记 • 【第4章 CSS3基础】

    全部章节   >>>> 本章目录 4.1 CSS 概述 4.1.1 CSS 简介 4.1.2 CSS3 基本语法 4.1.3 样式表的分类 4.2 CSS 基本选择器 4.2. ...

  8. 《MySQL数据操作与查询》- 综合项目 - 航空售票系统

    Mysql & SqlServer综合项目需求 1.系统整体功能 系统需支持以下功能: 维护客户信息.航班信息和票务信息 支持客户按多种条件组合查询航班信息和票务信息 支持客户根据票务信息订购 ...

  9. 编写Java程序,使用面向接口编程模拟不同动物的吼叫声

    返回本章节 返回作业目录 需求说明: 使用面向接口编程模拟不同动物的吼叫声 实现思路: 使用面向接口编程模拟不同动物吼叫声的实现思路: 定义发声接口Voice,在其中定义抽象吼叫方法sing(). 分 ...

  10. Log4j2基本使用入门

    1.Log4j2简介 Apache Log4j 2是日志框架Log4j的升级, 它比其前身Log4j 1.x提供了重要的改进, 并且参考了Logback中许多有用的改进, 同时修复了Logback的一 ...