2025CSP-J 冲刺训练(3):前缀和差分

2025CSP-J 冲刺训练 3

  • 一、基础知识
    • 1. 前缀和
    • 2. 差分
    • 3. 公式
      • 3.1 一维
      • 3.2 二维
  • 二、基础运用
    • 1. 堆积成山的书
      • 1.1 审题
      • 1.2 分析
      • 1.3 参考答案
    • 2. 皮皮过马路
      • 2.1 审题
      • 2.2 分析
      • 2.3 参考答案
    • 3. 吃豆子
      • 3.1 审题
      • 3.2 分析
      • 3.3 参考答案
  • 三、高阶应用
    • 1. 老式录音机
      • 1.1 审题
      • 1.2 参考答案
    • 2. [NOIP2012 提高组] 借教室

一、基础知识

1. 前缀和

前缀和(又叫积分):在一个数字组成的序列中从位置 1 1 1 到位置 n n n 这个区间内的所有数字之和。

例如:

a i \tt a_i ai12345678
p f x i \tt pfx_i pfxi1361015212836

前缀和可以大大提高查询区间和的时间复杂度。如果按照普通的 for 循环,时间复杂度为 O ( r − l + 1 ) O(r-l+1) O(rl+1),使用前缀和后套用公式 p f x r − p f x l − 1 \tt pfx_r-pfx_{l-1} pfxrpfxl1,就可以直接用 O ( 1 ) O(1) O(1) 的时间复杂度获得答案。

2. 差分

差分:求相邻两个元素的差值并存储,也是前缀和的逆运算。

例如:

a i \tt a_i ai1361015212836
d i f f i \tt diff_i diffi12345678

3. 公式

3.1 一维

3.2 二维

二维前缀和 p f x i , j = p f x i − 1 , j + p f x i , j − 1 − p f x i − 1 , j − 1 + a i , j \tt pfx_{i,j}=pfx_{i-1,j}+pfx_{i,j-1}-pfx_{i-1,j-1}+a_{i,j} pfxi,j=pfxi1,j+pfxi,j1pfxi1,j1+ai,j
二维区间和 p f x x 2 , y 2 − p f x x 1 − 1 , y 2 − p f x x 2 , y 1 − 1 + p f x x 1 − 1 , y 1 − 1 \tt pfx_{x_2,y_2}-pfx_{x_1-1,y_2}-pfx_{x_2,y_1-1}+pfx_{x_1-1,y_1-1} pfxx2,y2pfxx11,y2pfxx2,y11+pfxx11,y11


二维差分区间范围统一+1 d i f f x 1 , y 1 + 1 , d i f f x 1 , y 2 + 1 − 1 , d i f f x 2 + 1 , y 1 − 1 , d i f f x 2 + 1 , y 2 + 1 + 1 \tt diff_{x_1,y_1}+1,diff_{x_1,y_2+1}-1,diff_{x_2+1,y_1}-1,diff_{x_2+1,y_2+1}+1 diffx1,y1+1,diffx1,y2+11,diffx2+1,y11,diffx2+1,y2+1+1


用差分数组求前缀和就可以获得原数组。

二、基础运用

1. 堆积成山的书

1.1 审题

有两叠书,分别有 N N N M M M 本。
看完第一叠自顶向下第 i i i 本书需要 A i A_i Ai 分钟,看完第二叠自顶向下第 i i i 本书需要 B i B_i Bi ​分钟。
你每次可以花时间看完任意一叠书(不为空)的最上面那一本书,然后把它移除。
问你在 K K K 分钟内最多能看完几本书?

1.2 分析

我们可以使用前缀和数组 pfx[],更方便地计算累积时间。这道题的突破口是通过遍历第一叠书和第二叠书,找到能在限定时间内看完的最大本数。

1.3 参考答案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2e5+8;
ll n,m,k,pfx[MAXN];
int main(){cin>>n>>m>>k;for(int i=1,a;i<=n;i++){cin>>a;pfx[i]=pfx[i-1]+a;}ll sum=0,idx=n,ans;//sum:第二叠书的总时间,idx:第一叠书的剩余本数//尝试让第一叠书能够在时间限制内看完的最大本数while(idx>0&&pfx[idx]>k)idx--;// 少看一本}ans=idx;//第一叠书的前idx本书//逐本判断第二叠书能否在时间限制内看完,并更新答案for(int i=1,b;i<=m;i++){cin>>b;sum+=b;//累加第二叠书的时间//判断第一叠书是否能在时间限制内看完while(idx>=0&&pfx[idx]+sum>k)idx--;if(idx==-1)break;//如果第一叠书已经无法看完,跳出循环ans=max(ans,idx+i);//更新答案}cout<<ans;//输出答案return 0;
}

2. 皮皮过马路

2.1 审题

每天放学的时候,皮皮和他的朋友们都会穿过校门口的马路。
考虑皮皮的学校在二维平面的地图,马路沿水平方向延伸,马路的一侧由直线 y = 0 y=0 y=0 描述,另一侧由直线 y = 1 y=1 y=1 描述。
i i i 个小朋友从马路一侧的位置 ( a i , 0 ) (a_i,0) (ai,0) 沿直线过马路到达另一侧的位置 ( b i , 1 ) (b_i,1) (bi,1)
所有 a i a_i ai 互不相同,所有 b i b_i bi 互不相同。
尽管他的朋友们行动敏捷,他还是担心行动路径交叉的两个小朋友在过马路时发生碰撞。
皮皮认为,如果一个小朋友的行动路径没有跟其他任何小朋友的行动路径相交,则该小朋友是安全的。
请帮助皮皮计算安全的小朋友的数量。

2.2 分析

善用前缀信息和后缀信息。

2.3 参考答案

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+8;
int n,ans,pfx_mx[MAXN],sfx_mn[MAXN];
struct Node{int a,b;bool operator<(const Node&rhs)const{return a<rhs.a;}
}p[MAXN];
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>p[i].a>>p[i].b;sort(p+1,p+n+1);pfx_mx[0]=-1e9,sfx_mn[n+1]=1e9;for(int i=1;i<=n;i++)pfx_mx[i]=max(pfx_mx[i-1],p[i].b);for(int i=n;i>=1;i--)sfx_mn[i]=min(sfx_mn[i+1],p[i].b);for(int i=1;i<=n;i++)if(p[i].b==pfx_mx[i]&&p[i].b==sfx_mn[i])ans++;cout<<ans;return 0;
}

3. 吃豆子

3.1 审题

现在有一个 n × m n×m n×m 的棋盘,左下角的格子为 ( 1 , 1 ) (1,1) (1,1),右上角格子为 ( n , m ) (n,m) (n,m),每个棋盘格子可以放任意数量的豆子。
小明有 k k k 次操作,对于每次操作给出四个数字 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 x1,y1,x2,y2,表示小明会将所有 ( x , y ) (x,y) (x,y) 满足 x 1 ≤ x ≤ x 2 , y 1 ≤ y ≤ y 2 x_1≤x≤x_2,y_1≤y≤y_2 x1xx2,y1yy2 格子放上一个豆子。
在小明完成 k k k 次操作后,他将对你进行 q q q 次询问。
每次询问给出四个数 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 x1,y1,x2,y2,问所有 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 满足 x 1 ≤ x ≤ x 2 , y 1 ≤ y ≤ y 2 x_1≤x≤x_2,y_1≤y≤y_2 x1xx2,y1yy2 的格子上的豆子的总数和为多少?

3.2 分析

区间和模板,但是会超时:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2008;
const int MAXM=2008;
int n,m,k,q,a[MAXN][MAXM],pfx[MAXN][MAXM];
int main() {cin>>n>>m>>k>>q;for(int i=1,x1,y1,x2,y2;i<=k;i++){cin>>x1>>y1>>x2>>y2;for(int j=x1;j<=x2;j++)for(int k=y1;k<=y2;k++)a[j][k]++;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)pfx[i][j]=pfx[i-1][j]+pfx[i][j-1]-pfx[i-1][j-1]+a[i][j];for(int i=1,x1,y1,x2,y2;i<=q;i++){cin>>x1>>y1>>x2>>y2;cout<<pfx[x2][y2]-pfx[x1-1][y2]-pfx[x2][y1-1]+pfx[x1-1][y1-1]<<endl;}return 0;
}

所以需要用二维差分和二维前缀和,两者之间互相转换。

3.3 参考答案

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2008;
const int MAXM=2008;
int n,m,k,q,diff[MAXN][MAXM],a[MAXN][MAXM],pfx[MAXN][MAXM];
signed main(){cin>>n>>m>>k>>q;for(int i=1,x1,y1,x2,y2;i<=k;i++){cin>>x1>>y1>>x2>>y2;diff[x1][y1]++;diff[x1][y2+1]--;diff[x2+1][y1]--;diff[x2+1][y2+1]++;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){a[i][j]=diff[i][j]+(i>1?a[i-1][j]:0)+(j>1?a[i][j-1]:0)-(i>1&&j>1?a[i-1][j-1]:0);pfx[i][j]=a[i][j]+(i>1?pfx[i-1][j]:0)+(j>1?pfx[i][j-1]:0)-(i>1&&j>1?pfx[i-1][j-1]:0);}for(int i=1,x1,y1,x2,y2;i<=q;i++){cin>>x1>>y1>>x2>>y2;int result=pfx[x2][y2]-(x1>1?pfx[x1-1][y2]:0)-(y1>1?pfx[x2][y1-1]:0)+(x1>1&&y1>1?pfx[x1-1][y1-1]:0);cout<<result<<endl;}return 0;
}

三、高阶应用

1. 老式录音机

1.1 审题

小明要用录像机录 N N N 个电视节目。 一共有 C C C 个电视频道,从 1 1 1 C C C 编号。
i i i 个电视节目从时刻 s i s_i si 开始,时刻 t i t_i ti 结束,在频道 c i c_i ci 播出。(包含开始时刻 s i s_i si,不包含结束时刻 t i t_i ti)
同一个频道不会同时播出多个节目。
如果某个录像机在时刻 S S S 到时刻 T T T 录像某个频道的节目,如果接下来想用它录像其他频道的节目,需要将这个录像机接到另一个频道上,操作时间为 D D D,所以最早必须等到 T + D T+D T+D 时刻才能开始录制其他频道的节目。
若要录下全部 N N N 个节目,至少需要多少台录像机?

1.2 参考答案

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+8;
const int MAXT=2e6+8;
int n,c,d,maxt=0,diff[MAXT];
struct show{int s,t,c;bool operator<(show&rhs)const{if(c!=rhs.c)return c<rhs.c;else return s<rhs.s;}
}s[MAXN];
int main(){cin>>n>>c>>d;for(int i=1;i<=n;i++){cin>>s[i].s>>s[i].t>>s[i].c;maxt=max(maxt,s[i].t);}sort(s+1,s+n+1);for(int i=1;i<=n;i++){if(s[i].c==s[i-1].c&&s[i-1].t+d>s[i].s){diff[s[i-1].t+d]++;diff[s[i].t+d]--;}else{diff[s[i].s]++;diff[s[i].t+d]--;}}int ans=0,cnt=0;for(int i=1;i<=maxt;i++)cnt+=diff[i],ans=max(ans,cnt);cout<<ans;return 0;
}

2. [NOIP2012 提高组] 借教室

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+8;
int n,m,d[MAXN],s[MAXN],t[MAXN],base[MAXN],diff[MAXN];
bool check(int ans){for(int i=1;i<=n;i++)diff[i]=base[i];for(int i=1;i<=ans;i++)diff[s[i]]-=d[i],diff[t[i]+1]+=d[i];int rmn=0;for(int i=1;i<=n;i++){rmn+=diff[i];if(rmn<0)return false;}return true;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++)cin>>base[i];for(int i=n;i>=1;i--)base[i]-=base[i-1];for(int i=1;i<=m;i++)cin>>d[i]>>s[i]>>t[i];if(check(m))return cout<<0<<endl,0;int l=0,r=m;while(l<r){int mid=l+(r-l>>1);if(check(mid))l=mid+1;else r=mid;}cout<<-1<<endl<<l;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4995.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子科大2024秋《大数据分析与智能计算》真题回忆

考试日期&#xff1a;2025-01-08 课程&#xff1a;成电信软学院-大数据分析与智能计算 形式&#xff1a;开卷 考试回忆版 简答题&#xff08;4*15&#xff09; 1. 简述大数据的四个特征。分析每个特征所带来的问题和可能的解决方案 2. HDFS的架构的主要组件有哪些&#xff0…

Windows电脑安装USB Redirector并实现内外网跨网USB共享通信访问

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 我们每天都在与各种智能设备打交道&#xff0c;从手机到电脑&#xff0c;再到各种外设&#xff0c;它们已经…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…

多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)

文章目录 1.背景2.问题分析3.解决方案3.1解决思路3.2解决过程3.2.1 封装播放组件3.2.2 隐形的视频div3.2.3 截取封面图 3.3 结束 1.背景 有这样一个需求&#xff1a; 给你一个监控列表&#xff0c;每页展示多个监控&#xff08;至少12个&#xff0c;m3u8格式&#xff09;&…

VS Code AI开发之Copilot配置和使用详解

随着AI开发工具的迅速发展&#xff0c;GitHub Copilot在Cursor、Winsuf、V0等一众工具的冲击下&#xff0c;推出了免费版本。接下来&#xff0c;我将为大家介绍GitHub Copilot的配置和使用方法。GitHub Copilot基于OpenAI Codex模型&#xff0c;旨在为软件开发者提供智能化的代…

前端开发Web

Ajax 概念:Asynchronous JavaScriptAnd XML&#xff0c;异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的…

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合&#xff0c;用于管理 密码 和 资源限制。 每个用户都对应一个profiles&#xff0c;可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…

ConvBERT:通过基于跨度的动态卷积改进BERT

摘要 像BERT及其变体这样的预训练语言模型最近在各种自然语言理解任务中取得了令人印象深刻的性能。然而&#xff0c;BERT严重依赖于全局自注意力机制&#xff0c;因此存在较大的内存占用和计算成本。尽管所有的注意力头都从全局角度查询整个输入序列以生成注意力图&#xff0…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

豆包升级了“眼睛”,看APP截图就能写代码了!超低价让多模态AI普惠

金磊 发自 上海量子位 | 公众号 QbitAI 豆包的“眼睛”升级了&#xff0c;现在让它看一眼APP截图&#xff0c;就能直接给你生成代码&#xff01; 话不多说&#xff0c;我们直接给它上一个难度。 例如我们先随机截取一张网站的图片&#xff1a; 再来到火山方舟的大模型广场&…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具&#xff0c;可以帮助开发者定位计算资源&#xff08;如CPU、GPU&#xff09;的瓶颈&#xff0c;从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况&#xff0c;能够有效识别并解决性能瓶颈。 2、原…

vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权

文章目录 简介一、先看效果1.1 授权定位前&#xff0c;先弹出隐私协议弹框1.2 上述弹框点击同意&#xff0c;得到如下弹框1.3 点击三个点&#xff0c;然后点设置 1.4 在1.2步骤下&#xff0c;无论同意或者拒绝 二、manifest.json 文件配置三、微信公众平台配置3.1 登录进入微信…

vue3使用音频audio标签

文章目录 一、背景二、页面三、标签介绍四、代码五、代码说明场景1&#xff1a;针对加载固定格式的比如MP3文件&#xff0c;可直接使用\<audio>标签场景2&#xff1a;针对播放告警内容&#xff0c;比如中文或者英文词条情况 一、背景 项目使用vue3&#xff0c;需求针对告…

工业制造离不开的BOM

在制造业的浩瀚星空中&#xff0c;物料清单&#xff08;BOM&#xff09;犹如“北极星”&#xff0c;牢牢指引着产品从设计蓝图迈向实物诞生的全过程。 BOM的分类 按照设计制造的不同阶段&#xff0c;将BOM划分为设计BOM、工艺BOM、制造BOM三种类型。 设计BOM Engineering BO…

【Python】循环语句

while 基本语法格式 while 条件:循环体条件为真, 则执行循环体代码.条件为假, 则结束循环 num 1 while num < 10 :print(num)num 1注&#xff1a; 在 print 函数中&#xff0c;可以使用 end 参数来指定输出结束时使用的字符。默认情况下&#xff0c;end 参数的值为 &qu…

TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文

本篇内容将介绍TsMaster中常用的Panel面板控件以及使用Panel控件通过系统变量以及c小程序来修改信号的值&#xff0c;控制报文的发送等。 目录 一、常用的Panel控件介绍 1.1系统——启动停止按钮 1.2 显示控件——文本框 1.3 显示控件——分组框 1.4 读写控件——按钮 1.…

LeetCode:37. 解数独

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff…

PyTorch使用教程(10)-torchinfo.summary网络结构可视化详细说明

1、基本介绍 torchinfo是一个为PyTorch用户量身定做的开源工具&#xff0c;其核心功能之一是summary函数。这个函数旨在简化模型的开发与调试流程&#xff0c;让模型架构一目了然。通过torchinfo的summary函数&#xff0c;用户可以快速获取模型的详细结构和统计信息&#xff0…

【22】Word:小李-高新技术企业政策❗

目录 题目​ NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在删除空白行等要求&#xff0c;可以到最后来完成。注意最后一定要检查此部分&#xff01;注意&#xff1a;大多是和事例一样即可&#xff0c;不用一摸一样&#xff0c;但也不要差太多。 题目 NO1.2 F12Fn&a…

TDengine 做 Apache SuperSet 数据源

‌Apache Superset‌ 是一个现代的企业级商业智能&#xff08;BI&#xff09;Web 应用程序&#xff0c;主要用于数据探索和可视化。它由 Apache 软件基金会支持&#xff0c;是一个开源项目&#xff0c;它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…