题目

小 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\limits_{j=l_i}^{r_i}[w_j \ge W] \times \sum\limits_{j=l_i}^{r_i}[w_j \ge W]v_j
\]

其中 \(j\) 为矿石编号。

这批矿产的检验结果 \(y\) 为各个区间的检验值之和。即:\(\sum\limits_{i=1}^m y_i\)

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

解析

这是一道比较清晰明了的二分答案。

可以看出整个式子的自变量是 \(W\),因变量是此时得到的 \(y\)。

那么就来判断是否可以运用二分来解,首先判断单调性:

当 \(W\) 比最轻的矿石质量还小时,所有的矿石都可以参与运算,计算出来的 \(y\) 必定最大。

当 \(W\) 比最重的矿石质量还大时,所有的矿石都不能参与运算,计算出来的 \(y\) 必定最小。

因此,\(W\) 越小,参与计算的数就越多,\(y\) 也就越大。

所以单调性出来了,我们就可以在区间内通过枚举 \(W\) 来得到答案了。

然后就 \(TLE\) 了……

优化

查看代码发现,二分部分肯定是不会有什么超时的地方,那就是 check 函数的问题了。

发现在每次计算过程中由于重复计算造成了大量的浪费,于是考虑用前缀和优化。

使用 sum_n[i] 来表示区间中合格部分数量,sum_v[i] 来记录区间中合格部分价值。

最后进行计算。

#include<iostream>
#include<algorithm>
#include<cstdio>
#define int long long using namespace std; int n,m,s;
int w[200500],v[200500];
int l[200500],r[200500]; int sum_n[200500],sum_v[200500]; long long ans = 0; void init()
{
scanf("%lld%lld%lld",&n,&m,&s);
for(int i = 1;i <= n; i++)
scanf("%lld%lld",&w[i],&v[i]);
for(int i = 1;i <= m; i++)
scanf("%lld%lld",&l[i],&r[i]); return ;
} long long check(int W)
{
long long ans = 0;
for(int i = 1;i <= n; i++)
{
if( W > w[i] )// 要用前缀和,不然会炸掉!!!
{
sum_n[i] = sum_n[i-1];
sum_v[i] = sum_v[i-1];
}
else
{
sum_n[i] = sum_n[i-1] + 1;
sum_v[i] = sum_v[i-1] + v[i];
}
} for(int i = 1;i <= m; i++)
{
long long a,b;
a = sum_v[r[i]] - sum_v[l[i]-1];
b = sum_n[r[i]] - sum_n[l[i]-1];
ans += a*b;
} return ans;
} long long _abs(long long a)
{
if( a > 0 )
return a;
return -a;
} signed main()
{
init(); int left = 0,right = 1000000,mid; while( left <= right )
{
mid = (left + right)>>1;
if( check(mid) > s )
left = mid + 1;
else
right = mid - 1;
}
ans = _abs(check(left) - s); if( _abs(check(right) - s) < ans )
ans = _abs(check(right) - s); printf("%lld",ans);
return 0;
}

总结

题总体来说并不算难,但细节仍需要注意。

例如在考试中,就很有可能会忘记前缀和优化的问题,导致失去 30 分。

还有一直存在的 long long 的问题,同样会影响数十分。

要注重时间复杂度,重视算法的优化。做题时一定要每道题计算时间复杂度,不然考场追悔莫及。

P1314 聪明的质监员(题解)的更多相关文章

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

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

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

    P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...

  3. 洛谷P1314 聪明的质监员

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

  4. luogu P1314 聪明的质监员 x

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

  5. luoguP1314 聪明的质监员 题解(NOIP2011)

    P1314 聪明的质监员 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include< ...

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

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

  7. NOIP2011聪明的质监员题解

    631. [NOIP2011] 聪明的质监员 ★★   输入文件:qc.in   输出文件:qc.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 小 T 是一名质量监督 ...

  8. 【luogu P1314 聪明的质监员】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1314 二分答案 但是计算区间贡献的时候 直接暴力会挂 前缀和加速 #include <cstdio&g ...

  9. 『题解』洛谷P1314 聪明的质监员

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 小T是一名质量监督员,最近负责检验一批矿产的质量.这 ...

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

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

随机推荐

  1. 彻底掌握Makeifle(三)

    彻底掌握Makeifle(三) 前言 在前面的文章彻底掌握Makefile(一)和彻底掌握Makefile(二)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章当中我们将继续介绍一 ...

  2. [基础] BS/CS 区别 Http/Https 区别 中间件请求

    BS和CS的区别:   1.BS结构:Browser-Server-从浏览器到服务器,浏览器打开的所有内容都属于BS(三大主流浏览器Safari.Chrome和Firefo)   2.CS结构:Cli ...

  3. SSM整合以及相关补充

    SSM整合以及相关补充 我们在前面已经学习了Maven基本入门,Spring,SpringMVC,MyBatis三件套 现在我们来通过一些简单的案例,将我们最常用的开发三件套整合起来,进行一次完整的项 ...

  4. kubernetes Tcp流量可视化

    kubernetes Tcp流量可视化 使用k8spacket和grafana的node graph插件可以查看kubernetes pod的TCP相关信息,如connection.bytes.和du ...

  5. JUC(8)JMM

    文章目录 1.JMM 2.volatile 3.单例模式 1.JMM Volatile是java虚拟机提供轻量级的同步机制 1.保证可见性 2.不保证原子性 3.禁止指令重排 什么是JMM java内 ...

  6. Doris开发手记4:倍速性能提升,向量化导入的性能调优实践

    最近居家中,对自己之前做的一些工作进行总结.正好有Doris社区的小伙伴吐槽向量化的导入性能表现并不是很理想,就借这个机会对之前开发的向量化导入的工作进行了性能调优,取得了不错的优化效果.借用本篇手记 ...

  7. springMVC实现文件的上传和下载

    文件的下载功能 @RequestMapping("/testDown")public ResponseEntity<byte[]> testResponseEntity ...

  8. ubuntu 安装anaconda3

    ubuntu 安装anaconda3 官网:https://www.anaconda.com/ 下载:https://www.anaconda.com/products/individual#Down ...

  9. Codeforces Round #781(C. Tree Infection)

    Codeforces Round #781 C. Tree Infection time limit per test 1 second memory limit per test 256 megab ...

  10. python 基本使用 异常判断

    简单常用 isinstance 判断一个对象是否是一个已知的类型 arg=123 isinstance(arg, int) #输出True isinstance(arg, str) #输出False ...