news 2026/4/16 17:08:55

刷题日记day5(二分+前缀和)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
刷题日记day5(二分+前缀和)

题目描述

蒟蒻的第五篇博客希望大家支持

  • 1314聪明的质检员

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

题目描述

小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有n nn个矿石,从1 11n nn逐一编号,每个矿石都有自己的重量w i w_iwi以及价值v i v_ivi。检验矿产的流程是:

  1. 给定m mm个区间[ l i , r i ] [l_i,r_i][li,ri]
  2. 选出一个参数W WW
  3. 对于一个区间[ l i , r i ] [l_i,r_i][li,ri],计算矿石在这个区间上的检验值y i y_iyi

y i = ∑ j = l i r i [ w j ≥ W ] × ∑ j = l i r i [ w j ≥ W ] v j 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_jyi=j=liri[wjW]×j=liri[wjW]vj

其中j jj为矿石编号,[ p ] [p][p]是指示函数,若条件p pp为真返回1 11,否则返回0 00

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

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

输入格式

第一行包含三个整数n , m , s n,m,sn,m,s,分别表示矿石的个数、区间的个数和标准值。

接下来的n nn行,每行两个整数,中间用空格隔开,第i + 1 i+1i+1行表示i ii号矿石的重量w i w_iwi和价值v i v_ivi

接下来的m mm行,表示区间,每行两个整数,中间用空格隔开,第i + n + 1 i+n+1i+n+1行表示区间[ l i , r i ] [l_i,r_i][li,ri]的两个端点l i l_ilir i r_iri。注意:不同区间可能重合或相互重叠。

输出格式

一个整数,表示所求的最小值。

输入输出样例 #1

输入 #1

5 3 15 1 5 2 5 3 5 4 5 5 5 1 5 2 4 3 3

输出 #1

10

说明/提示

【输入输出样例说明】

W WW4 44的时候,三个区间上检验值分别为20 , 5 , 0 20,5,020,5,0,这批矿产的检验结果为25 2525,此时与标准值S SS相差最小为10 1010

【数据范围】

对于10 % 10\%10%的数据,有1 ≤ n , m ≤ 10 1 ≤n,m≤101n,m10

对于30 % 30\%30%的数据,有1 ≤ n , m ≤ 500 1 ≤n,m≤5001n,m500

对于50 % 50\%50%的数据,有1 ≤ n , m ≤ 5 , 000 1 ≤n,m≤5,0001n,m5,000

对于70 % 70\%70%的数据,有1 ≤ n , m ≤ 10 , 000 1 ≤n,m≤10,0001n,m10,000

对于100 % 100\%100%的数据,有1 ≤ n , m ≤ 200 , 000 1 ≤n,m≤200,0001n,m200,0000 < w i , v i ≤ 1 0 6 0 < w_i,v_i≤10^60<wi,vi1060 < s ≤ 1 0 12 0 < s≤10^{12}0<s10121 ≤ l i ≤ r i ≤ n 1 ≤l_i ≤r_i ≤n1lirin

思路分析

注意到题目让我们最小化某一个值,这种题目往往采用二分答案的方法,有些时候我们是直接二分答案的范围,有些时候我们是二分一个中间变量的范围,再得到答案,此题为后者。我们再分析一下题目是否有某种单调性,假设起始状态给了一个无限大的基准值W,那么y就等于0,那么s-y==s,随着基准值W的减小,会让公式所求值y变小,接着目标值s-y就会变小,显然有单调性,我们确定了方法二分答案。
接着是如何具体处理这个问题,我们会发现,随着y的不断减小,目标值s-y有可能是负数,这也就是我们二分判断边界的关键逻辑,当s-y大于等于0时,我们要让y增大,即W减小,即r=mid,当s-y小于0时,我们要让y减小,即W增大,即l=mid

代码展示

#include<iostream>#include<algorithm>#include<cstring>#include<vector>#definexfirst#defineysecondusingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PLL;constintN=2*1e5+10;LL n,m,s;LL w[N],val[N],temp[N],sum_temp[N];intcnt[N],sum_cnt[N];vector<PLL>q;LLcheck(LL x){memset(cnt,0,sizeofcnt);memset(sum_cnt,0,sizeofsum_cnt);memset(sum_temp,0,sizeofsum_temp);memcpy(temp,val,sizeofval);LL ans=0;for(inti=1;i<=n;i++){if(w[i]>=x)cnt[i]++;elsetemp[i]=0;}for(inti=1;i<=n;i++)sum_cnt[i]=sum_cnt[i-1]+cnt[i];for(inti=1;i<=n;i++)sum_temp[i]=sum_temp[i-1]+temp[i];for(inti=0;i<q.size();i++){LL l=q[i].x,r=q[i].y;ans+=(LL)(sum_cnt[r]-sum_cnt[l-1])*(sum_temp[r]-sum_temp[l-1]);}returns-ans;}intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m>>s;for(inti=1;i<=n;i++){LL x,y;cin>>x>>y;w[i]=x,val[i]=y;}while(m--){LL x,y;cin>>x>>y;q.push_back({x,y});}LL l=0,r=1e6+1;while((l+1)!=r){LL mid=(l+r)/2;if(check(mid)>=0)r=mid;elsel=mid;//cout<<l<<" "<<r<<endl;}//cout<<abs(check(l))<<endl;//cout<<abs(check(r))<<endl;cout<<min(abs(check(l)),abs(check(r)))<<endl;return0;}

细节问题

每次调用check函数都是需要初始化的,仔细读题正确翻译那个公式的意思
为什么题号是1314这让单身狗心很痛好嘛,做题还被伤害了

AI详细注释代码

#include<iostream>#include<algorithm>#include<cstring>#include<vector>#definexfirst// pair的第一个元素(区间左端点)#defineysecond// pair的第二个元素(区间右端点)usingnamespacestd;typedeflonglongLL;// 用LL避免数据溢出(结果可能很大)typedefpair<LL,LL>PLL;// 存储区间的左右端点(l,r)constintN=2*1e5+10;// 数组最大长度(适配n,m<=2e5)// 全局变量LL n,m,s;// n=矿石数,m=区间数,s=标准值LL w[N],val[N];// w[i]=第i个矿石重量,val[i]=第i个矿石价值LL temp[N],sum_temp[N];// temp[i]=筛选后的矿石价值,sum_temp=temp的前缀和intcnt[N],sum_cnt[N];// cnt[i]=标记矿石是否≥W,sum_cnt=cnt的前缀和vector<PLL>q;// 存储所有区间[l,r]// 检查函数:给定参数W=x,计算检验值与标准值s的差值(s - 总检验值)LLcheck(LL x){// 初始化前缀和/标记数组为0memset(cnt,0,sizeofcnt);memset(sum_cnt,0,sizeofsum_cnt);memset(sum_temp,0,sizeofsum_temp);// 拷贝原始价值数组到temp(后续仅修改不满足条件的位置)memcpy(temp,val,sizeofval);LL ans=0;// 存储总检验值// 1. 标记满足w[i]≥x的矿石,并清空不满足的矿石价值for(inti=1;i<=n;i++){if(w[i]>=x)cnt[i]++;// 满足条件,标记为1elsetemp[i]=0;// 不满足条件,价值置0}// 2. 计算前缀和(快速求区间内满足条件的矿石数/价值和)for(inti=1;i<=n;i++)sum_cnt[i]=sum_cnt[i-1]+cnt[i];// 前缀和:1~i中≥x的矿石数量for(inti=1;i<=n;i++)sum_temp[i]=sum_temp[i-1]+temp[i];// 前缀和:1~i中≥x的矿石价值和// 3. 遍历所有区间,计算总检验值for(inti=0;i<q.size();i++){LL l=q[i].x,r=q[i].y;// 当前区间的左右端点// 区间内满足条件的矿石数 × 区间内满足条件的矿石价值和 → 累加总检验值ans+=(LL)(sum_cnt[r]-sum_cnt[l-1])*(sum_temp[r]-sum_temp[l-1]);}returns-ans;// 返回标准值与总检验值的差值(用于二分判断)}intmain(){// 加速cin/cout,避免大数据量超时ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);// 输入基础参数:矿石数、区间数、标准值cin>>n>>m>>s;// 输入每个矿石的重量和价值for(inti=1;i<=n;i++){LL x,y;cin>>x>>y;w[i]=x,val[i]=y;}// 输入所有区间,存入vectorwhile(m--){LL x,y;cin>>x>>y;q.push_back({x,y});}// 二分查找最优W值:W范围0~1e6+1(w[i]≤1e6)LL l=0,r=1e6+1;while((l+1)!=r){// 二分终止条件:左右边界相邻LL mid=(l+r)/2;// 中间值if(check(mid)>=0)r=mid;// 差值≥0 → 需增大W,缩小右边界elsel=mid;// 差值<0 → 需减小W,扩大左边界}// 比较最终两个边界的差值绝对值,取最小值(最优解)cout<<min(abs(check(l)),abs(check(r)))<<endl;return0;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 5:35:09

QMS软件系统:一体化智能平台,智绘卓越质量新图景——全星质量管理QMS软件系统应用解析

QMS软件系统&#xff1a;一体化智能平台&#xff0c;智绘卓越质量新图景——全星质量管理QMS软件系统应用解析 在当今日益激烈的市场竞争中&#xff0c;质量不仅是企业的生命线&#xff0c;更是赢得客户信任、提升品牌价值的核心要素。《全星质量管理QMS软件系统》作为一套集成…

作者头像 李华
网站建设 2026/4/16 12:49:40

26、K8S-Sidecar代理

在 Kubernetes 中&#xff0c;Sidecar 代理是一种常见的设计模式&#xff0c;用于增强服务的功能和隔离服务的职责。Sidecar 代理通常与主应用容器一起部署在同一个 Pod 中&#xff0c;负责处理一些非业务的通用任务&#xff0c;例如网络流量管理、监控、日志记录、安全性增强等…

作者头像 李华
网站建设 2026/4/16 11:24:27

西门子1200与3台台达DT330温控器通讯实现温控自由

西门子1200与3台台达DT330温控器通讯程序(XMZ1200-6) 功能&#xff1a;实现西门子1200PLC对3台台达DT330温控器进行485通讯控制&#xff0c;在触摸屏上设定温度&#xff0c;读取温度 器件&#xff1a;西门子12001214DC/DC/DC.昆仑通态TPC7022NI&#xff0c;西门子KTP700BasicPN…

作者头像 李华
网站建设 2026/4/16 17:06:28

如何一键生成炫酷效果闪图?闪图在线制作教程

闪图凭借明快的切换节奏、醒目的视觉效果&#xff0c;成为社交分享、海报点缀、短视频素材的热门选择。不用掌握复杂设计技巧&#xff0c;借助便捷的在线闪图制作工具&#xff0c;就能轻松制作出炫酷闪图&#xff0c;无论是日常娱乐还是创意创作&#xff0c;都能让你的内容脱颖…

作者头像 李华
网站建设 2026/4/16 12:14:40

NS3仿真——sixth

sixth是一个完整的TCP拥塞控制算法对比工具&#xff0c;对比三种算法&#xff1a;Cubic、NewReno、Vegas。一、代码整体架构1.1 头文件引入#include "ns3/applications-module.h" // 应用程序模块&#xff08;UDP/TCP应用&#xff09; #include "ns3/core-modu…

作者头像 李华