题解【洛谷P1314】[NOIP2011]聪明的质监员
题解
不难发现,\(W\)增大时,\(Y\)值会随之减小。
于是考虑二分\(W\)。
如何\(\mathcal{O}(N)check?\)
每一次前缀和记录一下\(1…i\)之间\(w_i \ge W\)的个数及\(v_i\)之和。
计算出\(|Y_1+Y_2+…+Y_m-S|\),与当前的最小答案取最小值。
返回\(Y_1+Y_2+…+Y_m > S\)。
代码
#include <bits/stdc++.h>
#define int long long
#define itn int
#define gI gi
using namespace std;
inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return f * x;
}
const int maxn = 200003;
int n, m, s, w[maxn], v[maxn], Y, l[maxn], r[maxn], maxx, sum, ans = 1000000000000007, qw[maxn], qv[maxn];
inline bool check(int x)
{
memset(qw, 0, sizeof(qw));
memset(qv, 0, sizeof(qv));//初始化
for (int i = 1; i <= n; i+=1) qw[i] = qw[i - 1] + (w[i] >= x), qv[i] = qv[i - 1] + (w[i] >= x) * (v[i]);//前缀和
Y = sum = 0;
for (int i = 1; i <= m; i+=1)
{
Y += (qw[r[i]] - qw[l[i] - 1]) * (qv[r[i]] - qv[l[i] - 1]);//计算Y值的和
}
if (Y - s < 0) sum = s - Y;
else sum = Y - s;
return Y >= s;
}
signed main()
{
n = gi(), m = gi(), s = gi();
for (int i = 1; i <= n; i+=1)
{
w[i] = gi(), v[i] = gi();
maxx = max(maxx, w[i]);
}
for (int i = 1; i <= m; i+=1)
{
l[i] = gi(), r[i] = gi();
}
int l = 0, r = maxx;
while (l <= r)
{
int mid = (l + r) >> 1;
if (check(mid)) l = mid + 1;
else r = mid - 1;
ans = min(ans, sum);//更新答案
}
printf("%lld\n", ans);//输出
return 0;
}
题解【洛谷P1314】[NOIP2011]聪明的质监员的更多相关文章
- 【洛谷p1314】聪明的质监员
聪明的质监员[题目链接] 有关算法: 二分答案: 但是你只二分答案是不够的,因为你check会炸,所以还要考虑前缀和: 首先假装我们的check已经写好了,main函数: int main() { n ...
- 洛谷 P1314 【聪明的质监员】
二分 思路: 这道题思路还是蛮好想的,一开始想的是暴力枚举w,然后再仔细一看,w增长时,y肯定减小,那么思路出来了: 二分 但是在时二分时,分得是左右端点lr,做错了 求出w的上下界,然后二分 只二分 ...
- NOIP2011聪明的质监员题解
631. [NOIP2011] 聪明的质监员 ★★ 输入文件:qc.in 输出文件:qc.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 小 T 是一名质量监督 ...
- NC16597 [NOIP2011]聪明的质监员
NC16597 [NOIP2011]聪明的质监员 题目 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿 ...
- 洛谷P1314 [NOIP2011提高组Day2T2] 聪明的质监员
P1314 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: ...
- 【洛谷P1314】[NOIP2011]聪明的质监员
聪明的质监员 题目链接:https://www.luogu.org/problemnew/show/P1314 Y(W)随W的值增大而减小 二分W的值,找到最小的W使得Y(W)>S: 比较Y(W ...
- [NOIP2011]聪明的质监员 题解
题目大意: 额--貌似蛮清晰的,就不赘述了. 思路: 首先不难发现M越大Y越小,因此可以二分答案(方向不要弄错),二分出最小的不小于S的Y即可.而计算Y时可用前缀和O(n+m)求得.两种边界情况也要考 ...
- NOIP2011 聪明的质监员
描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[Li ...
- [NOIP2011] 聪明的质监员 二分+前缀和
考试的时候打的二分但没有用前缀和维护.但是有个小细节手误打错了结果挂掉了. 绝对值的话可能会想到三分,但是注意到w增大的时候y是减小的,所以单调性很明显,用二分就可以.但注意一个问题,就是二分最后的结 ...
随机推荐
- MySQL概述及入门(二)
MySql概述及入门(二) MySQL架构 逻辑架构图: 执行流程图: MySQL的存储引擎 查询数据库支持的存储引擎 执行: show engines: 多存储引擎是mysql有别于其他数据库的一大 ...
- opencv —— saturate_cast 溢出保护
src.at<uchar>(i,j)[0] = saturate_cast<uchar>(data); if (data < 0) data = 0; else if ( ...
- 【python基础语法】第3天作业练习题
''' .将给定字符串的PHP替换为Python best_language = "PHP is the best programming language in the world! &q ...
- matplotlib制作图表数据
import matplotlib.pyplot as plt import matplotlib fig=plt.figure() labels=['陆地','海洋'] data=[29,71] p ...
- cf1214E
题意简述:构造一棵包含2*n个节点的树,要求2*i 和 2*i-1之间的距离等于d[i]<=n 1<=i<=n 给出N和d数组,输入对应的边 题解:对d数组按照从大到小排序,然后首先 ...
- 轻量级RPC设计与实现第四版
在本版本中引入了SPI机制,关于Java的SPI机制与Dubbo的SPI机制在以前的文章中介绍过. 传送门:Dubbo的SPI机制与JDK机制的不同及原理分析 因为设计的RPC框架是基于Spring的 ...
- linux 第一个知识点(my)
关于Linux - rwx rwx rwx root user 194 Oct : 19 21:24 test -:此符号为文件名,如果是d 则为目录,如果是l 则为连接 rwx: 这是所有者所有的 ...
- 《Photoshop 2020》初心版_v6 21.0.2.57
<Phtoshop 2020>初心版_v6 下载地址(5245) SHA1:E926A1B99D147A27A44050A5BCE2E69E2CDAEEAE 版本信息 发行版本 20 ...
- 51Nod 1449 砝码称重 (二进制思想)
现在有好多种砝码,他们的重量是 w0,w1,w2,... 每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组 ...
- python实用30个小技巧
python实用30个小技巧 展开1.原地交换两个数字Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: In [1]: x,y = 10 ,20 In [2]: ...