洛谷 P1314 【聪明的质监员】
二分
思路:
这道题思路还是蛮好想的,一开始想的是暴力枚举w,然后再仔细一看,w增长时,y肯定减小,那么思路出来了: 二分
但是在时二分时,分得是左右端点lr,做错了
求出w的上下界,然后二分
只二分是肯定不行的因为这是道蓝题呀我们在求出对应的yi时,用了n^2的时间复杂度,如何优化?要用到 前缀和
简单介绍一下,前缀和字面意思,就是前面一坨的和,我们用数组p表示,当我们需要求出区间[l , r]时,只需要将p[r]-p[l-1] ,证明很简单,推一下就行
注意事项:
开long long!!!
把最后的答案ans开大一点
这是一个单调递减的函数
左端点l要往左移1个(要判断l,所以从l-1开始),右端点r往右移两个(要判断w很大的情况,使y=0)
细节都在代码里了
#include <bits/stdc++.h>
using namespace std;
long long n , m , lef = 999999 , righ = 0 , S , anses , ans = 99999999999 , f;
long long l[200010] , r[200010] , w[200010] , v[200010] , p1[200010] , p2[200010];
long long work(long long ww){
f = 0;
memset(p1 , 0 , sizeof(p1)); //清空数组
memset(p2 , 0 , sizeof(p2));
for(int i = 1; i <= n; i++){
if(w[i] >= ww){
p1[i] = p1[i - 1] + v[i];
p2[i] = p2[i - 1] + 1;
}else{
p1[i] = p1[i - 1]; //不加进去的话就跟上次一样
p2[i] = p2[i - 1];
}
}
for(int i = 1; i <= m; i++) f += (p1[r[i]] - p1[l[i] - 1]) * (p2[r[i]] - p2[l[i] - 1]); //计算
return f;
}
int main(){
cin >> n >> m >> S;
for(long long i = 1; i <= n; i++) cin >> w[i] >> v[i] , righ = max(righ , w[i]) , lef = min(lef , w[i]);
for(long long i = 1; i <= m ;i++) cin >> l[i] >> r[i];
//cout << endl;
righ += 2;
lef--;
while(lef <= righ){
long long mid = (lef + righ) / 2;
anses = work(mid);
if(anses >= S) lef = mid + 1;
else righ = mid - 1;
if(ans > abs(anses - S)) ans = abs(anses - S); //求更优值
}
cout << ans;
return 0;
}
洛谷 P1314 【聪明的质监员】的更多相关文章
- 洛谷P1314 聪明的质监员
P1314 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: ...
- 洛谷P1314 聪明的质监员 题解
题目 聪明的质监员 题解 这道题和之前Sabotage G的那道题类似,都是用二分答案求解(这道题还要简单一些,不需要用数学推导二分条件,只需简单判断一下即可). 同时为了降低复杂度,肯定不能用暴力求 ...
- 洛谷 P1314 聪明的质监员 —— 二分
题目:https://www.luogu.org/problemnew/show/P1314 显然就是二分那个标准: 当然不能每个区间从头到尾算答案,所以要先算出每个位置被算了几次: 不知为何自己第一 ...
- [NOIP2011] 提高组 洛谷P1314 聪明的质监员
题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[L ...
- 洛谷 P1314 聪明的质监员【二分+前缀和】
真是zz, 题目很显然是二分W,然后判断,我一开始是用线段树维护当前w[i]>W的个数和v(公式就是区间满足要求的个数*满足要求的v的和),然后T成70 后来想到树状数组差分常数或许会小,于是改 ...
- 洛谷——P1314 聪明的质监员
https://www.luogu.org/problem/show?pid=1314 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每 ...
- 『题解』洛谷P1314 聪明的质监员
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 小T是一名质量监督员,最近负责检验一批矿产的质量.这 ...
- 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)
###一道二分答案加前缀和### 题目中已经暗示的很明显了 "尽可能靠近" " 最小值" 本题的主要坑点在于 long long 的使用 ##abs函数不支持l ...
- P1314 聪明的质监员(前缀和+二分)
P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...
- luogu P1314 聪明的质监员 x
P1314 聪明的质监员(至于为什么选择这个题目,可能是我觉得比较好玩呗) 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自 ...
随机推荐
- Java实现 洛谷 P1738 洛谷的文件夹
题目描述 kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现. 洛谷的网页端,有很多文件夹,文件夹还套着文件夹. 例如:/luogu/application/c ...
- 使用dotnet Cli向nuget发布包
长话短说, 今天分享如何在nuget.org创建并发布.NET Standard package. 前置 安装勾选.NET Core开发套件的Visual Studio; 安装dotnet Cli 从 ...
- linux系统判断内存是否达到瓶颈的小技巧
1.linux下最常用的系统状态监控工具top 工具,可以使用top -c 来进行查看当前内存的占用情况 free 为内存的剩余状态,当前为3.8G的空闲内存,总的物理内存是8G,按键 shift+m ...
- ESXI多网卡网络配置
1.两台路由器接入不同网络: 2.一台4网口服务器,网口分别为:vmnic0.vmnic1.vmnic2.vmnic3 3.ESXI6.5服务器虚拟机系统 测试环境模拟: 路由1:192.168.0. ...
- profile(/etc/profile)和bash_profile的区别
profile(/etc/profile)和bash_profile的区别 profile(/etc/profile),用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效.当用户登录 ...
- [windows][技巧]百度网盘提示您的电脑已安装百度网盘,是否覆盖,解决方法
目录 故障描述 解决方法 故障描述 解决方法 win+r,输入regedit,进入注册表 依次打开HKEY_CURRENT_USER->Software->Baidu->BaiDuY ...
- Centos 各个版本的下载源
China Alibaba Cloud Computing http://mirrors.aliyun.com/centos/ China Beijing Institute of Technolog ...
- CenterOS7 修改 SSH 端口
首先修改 /etc/ssh/sshd_config 文件中的 Port.修改前一定要备份 可以同时启用多个Port所以最好先追加一个端口,新端口校验没问题之后再把原端口删除 防火墙设置 # 永久开放端 ...
- C Primer Plus(三)
重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点 文件输入/输出 1.fgets函数在读取文件内容时会将换行符读入,但gets不会,fp ...
- APP自动化1——Appium+pycharm自动化环境搭建全流程
1. 安装python3,pycharm,可参考之前写的文档:https://www.cnblogs.com/chenweitoag/p/13154815.html 2. 准备以下必要工具: 基于wi ...