当前位置: 首页 > article >正文

从零学会基础算法前缀和差分:数组区间求和离散化基础

首先祝大家劳动节快乐开学两个月来学的东西不多主要掌握了两块内容前缀和/差分/离散化 和 数学基础。本文是第一篇重点整理前缀和相关内容。编程语言C 排版助手AI一、数组的三个简化技巧1. 前缀和核心思想在输入数组时用另一个数组预先存储前缀和从而快速计算任意区间的总和。公式构建prefix[i] prefix[i-1] a[i]查询区间 [l, r] 的和ans prefix[r] - prefix[l-1]题目区间求和给定一个长度为 n 的数组 a[1..n]有 q 次查询每次查询给出 l, r要求计算 a[l] a[l1] ... a[r] 的和。#includestdio.h int n; int a[100005]; long long prefix[100005]; int q; int main() { scanf(%d %d, n, q); int i; for(i 1; i n; i){ scanf(%d, a[i]); prefix[i] prefix[i-1] (long long)a[i]; } for(i 0; i q; i){ int l, r; scanf(%d %d, l, r); long long ans prefix[r] - prefix[l-1]; printf(%lld\n, ans); } return 0; }进阶二维前缀和核心思想思路与一维相同只是扩展到二维平面。公式构建prefix[i][j] prefix[i-1][j] prefix[i][j-1] - prefix[i-1][j-1] a[i][j]查询矩形 (x1,y1) 到 (x2,y2) 的和 ans prefix[x2][y2] - prefix[x1-1][y2] - prefix[x2][y1-1] prefix[x1-1][y1-1]题目子矩阵求和给定一个 n × m 的矩阵有 q 次查询每次查询给出一个矩形区域的左上角 (x1, y1) 和右下角 (x2, y2)要求计算该矩形区域内所有元素的和。#includestdio.h int n,m,q; int a[1005][1005]; long long prefix[1005][1005]; int main() { scanf(%d %d %d,n,m,q); int i,j; for(i1;in;i){ for(j1;jm;j){ scanf(%d,a[i][j]); prefix[i][j]prefix[i-1][j]prefix[i][j-1]-prefix[i-1][j-1]a[i][j]; } } for(i0;iq;i){ int x1,y1,x2,y2; scanf(%d %d %d %d,x1,y1,x2,y2); long long ansprefix[x2][y2]-prefix[x1-1][y2]-prefix[x2][y1-1]prefix[x1-1][y1-1]; printf(%lld\n,ans); } return 0; }2.差分给定一个长度为 n 的数组初始值已知。 接下来进行 q 次操作每次操作给出三个整数 l, r, x表示将数组中第 l 个到第 r 个元素包含两端的值都增加 x。 请输出经过所有操作后数组中每个元素的最终值。要点在多次对区间内连续的一段进行加减操作时可以利用差分一维差分的定义是相邻元素的差值我们需要知道一个结论是差分的前缀和是原数组而差分的变化量的前缀和是原数组的变化量如对[l,r]区间内的元素加x,用diff表示元素的变化量则diff[l],diff[r1]--;处理完之后对diff求前缀和就是当前元素增加的值。#includestdio.h int n,q; int a[100005]; int diff[1000005]; int main() { scanf(%d %d,n,q); int i; for(i1;in;i){ scanf(%d,a[i]); } for(i0;iq;i){ int l,r,x; scanf(%d %d %d,l,r,x); diff[l]x;diff[r1]-x; } long long currentadd0; for(i1;in;i){ currentadddiff[i]; a[i]currentadd; } for(i1;in;i){ printf(%d ,a[i]); } return 0; }进阶二维差分题目有一个 N×M 的房间初始时每个格子都是空的。现在有 Q 次操作每次操作给出一个矩形区域的左上角 (x1, y1) 和右下角 (x2, y2)表示在这个区域内铺上一层地毯。问Q 次操作后每个格子上有多少层地毯要点通过一维前缀和和差分的关系我们其实就能发现差分和前缀和是互逆的即差分的前缀和是原数组前缀和的差分是原数组而二维差分的定义是通过二维前缀和的公式逆向推到的diff[i][j]a[i][j]-a[i][j-1]-a[i-1][j]a[i-1][j-1];则对一个矩形区域内只有四个点的差分发生了变化同理#includestdio.h int diff[1005][1005]; int main() { int n, m, q; scanf(%d %d %d, n, m, q); int i; for(i 0; i q; i){ int x1, y1, x2, y2; scanf(%d %d %d %d, x1, y1, x2, y2); // 二维差分标记 diff[x1][y1]; diff[x1][y21]--; diff[x21][y1]--; diff[x21][y21]; } // 求二维前缀和原地还原 int j; for(i 1; i n; i){ for(j 1; j m; j){ diff[i][j] diff[i-1][j] diff[i][j-1] - diff[i-1][j-1]; printf(%d , diff[i][j]); } printf(\n); } return 0; }3.离散化当数轴范围覆盖非常大而开不了这么大的空间时但个数却远远小于范围可以通过离散化来遍历题目区间覆盖计数有 n 个区间 [l₁, r₁], [l₂, r₂], ..., [lₙ, rₙ]坐标范围可能很大比如 -10⁹ 到 10⁹但区间数量 n ≤ 10⁵。要求找出被最多区间覆盖的点输出最大覆盖次数。输入格式第一行一个整数 n接下来 n 行每行两个整数 lᵢ, rᵢ输出格式一个整数表示最大覆盖次数要点离散化的顺序可以归纳为三步1.接收关键点2.排序关键点并去重去重函数可以这样写int unique(int len){ int i; int j0; for(i0;ilen;i){ if(i0||coords[i]!coords[i-1]){ coords[j]coords[i]; } } return j; }3.二分查找映射然后差分#includestdio.h #includestdlib.h int n; int l[100005],r[100005]; int coords[200005]; int diff[200005]; int cmp(const void*a,const void*b){ return *(int *)a-*(int *)b; } int unique(int len){ int i; int j0; for(i0;ilen;i){ if(i0||coords[i]!coords[i-1]){ coords[j]coords[i]; } } return j; } int lower_bound(int target,int len){ int left0,rightlen-1; while(leftright){ int mid(right-left)/2left; if(coords[mid]target)leftmid1; else rightmid-1; return left; } } int main() { scanf(%d,n); int i; int coordslen0; for(i0;in;i){ scanf(%d %d,l[i],r[i]); coords[coordslen]l[i]; coords[coordslen]r[i]; } qsort(coords,coordslen,sizeof(int),cmp); coordslenunique(coordslen); for(i0;in;i){ int idx1lower_bound(l[i],coordslen); int idx2lower_bound(r[i],coordslen); diff[idx1];diff[idx21]--; } int currentadd0; int max0; for(i0;icoordslen1;i){ currentadddiff[i]; if(maxcurrentadd)maxcurrentadd; } printf(%d,max); return 0; }进阶二维离散化给定一个巨大的网格平面上面有 X 个矩形。求这些矩形覆盖的总面积重叠部分只算一次。1 ≤ N, M ≤ 10^91 ≤ X ≤ 1000步骤与一维同理不多赘述#includestdio.h #includestdlib.h int n; int x[10005]; int y[10005]; int x1[10005],y1[10005],x2[10005],y2[10005]; int xcnt0,ycnt0; int diff[2005][2005]; int cmp(const void*a,const void*b){ return *(int *)a-*(int *)b; } int unique(int len,int *arr){ int i; int j0; for(i0;ilen;i){ if(i0||arr[i]!arr[i-1]){ arr[j]arr[i]; } } return j; } int find_idx(int target,int len,int*arr){ int left0,rightlen-1; while(leftright){ int mid(right-left)/2left; if(arr[mid]target)leftmid1; else rightmid-1; } return left; } int main() { scanf(%d,n); int i,j; for(i0;in;i){ scanf(%d %d %d %d,x1[i],y1[i],x2[i],y2[i]); x[xcnt]x1[i]; x[xcnt]x2[i]1; y[ycnt]y1[i]; y[ycnt]y2[i]1; } qsort(x,xcnt,sizeof(int),cmp); qsort(y,ycnt,sizeof(int),cmp); xcntunique(xcnt,x); ycntunique(ycnt,y); for(i0;in;i){ int findx1find_idx(x1[i],xcnt,x); int findx2find_idx(x2[i]1,xcnt,x); int findy1find_idx(y1[i],ycnt,y); int findy2find_idx(y2[i]1,ycnt,y); diff[findx1][findy1]; diff[findx2][findy1]--; diff[findx1][findy2]--; diff[findx2][findy2]; } long long count0; for(i0;ixcnt;i){ for(j0;jycnt;j){ if(i0) diff[i][j]diff[i-1][j]; if(j0) diff[i][j]diff[i][j-1]; if(i0j0) diff[i][j]-diff[i-1][j-1]; if(diff[i][j]0) count (long long)(x[i1]-x[i])*(y[j1]-y[j]); } } printf(%lld,count); return 0; }不足之处可以补充

相关文章:

从零学会基础算法前缀和差分:数组区间求和离散化基础

首先祝大家劳动节快乐!开学两个月来学的东西不多,主要掌握了两块内容:前缀和/差分/离散化 和 数学基础。本文是第一篇,重点整理前缀和相关内容。 编程语言:C 排版助手:AI一、数组的三个简化技巧 1. 前缀和 …...

孤舟笔记 IO 与网络编程篇六 什么是网络四元组?它是理解TCP连接的关键

文章目录一、先说结论:四元组核心事实二、四元组是什么?三、一个端口能建立多少连接?四、客户端的连接上限五、NAT 和四元组六、四元组在负载均衡中的应用网络四元组 全景回答技巧与点评标准回答加分回答面试官点评个人网站面试官问"一个…...

孤舟笔记 IO 与网络编程篇五 网络编程你真的懂吗?从Socket到TCP连接全解析

文章目录一、先说结论:网络编程核心事实二、TCP 编程:三次握手的 Socket 视角三、UDP 编程:无连接的数据报四、服务端线程模型演进模型一:一连接一线程(最原始)模型二:线程池(改进&a…...

20 - 告别“无限上下文”的幻觉:大模型知识注入的“四层矩阵”与下一场权重战争

本专题系列文章共 21 篇,前 5 篇限时免费阅读 01 - 眩晕时代的定海神针:大模型落地的“第一性原理”与算力丰裕悖论 02 - 95%的AI投资打了水漂:五大错配如何扼杀你的“第二增长曲线” 03 - 从电力到AI:标准化已死,个性化永生——大模型时代的三大商业终局 04 - 你的护城…...

19 - 语言模型为何是AGI的开端?——从“知识压缩”到“智能涌现”的第一性原理

本专题系列文章共 21 篇,前 5 篇限时免费阅读 01 - 眩晕时代的定海神针:大模型落地的“第一性原理”与算力丰裕悖论 02 - 95%的AI投资打了水漂:五大错配如何扼杀你的“第二增长曲线” 03 - 从电力到AI:标准化已死,个性化永生——大模型时代的三大商业终局 04 - 你的护城…...

告别网络盲区:用RTL8811CU让旧笔记本变身Linux双频WiFi网卡/AP二合一网关

旧硬件新生:用RTL8811CU打造Linux双频无线网关实战指南 每次升级笔记本后,那些陪伴我们多年的旧设备往往被束之高阁。作为一名网络技术爱好者,我发现这些"退役"笔记本其实蕴藏着巨大的再利用价值——特别是当它们遇到RTL8811CU这样…...

【可口可乐全球设计中心认证流程】:从Prompt工程到DPI输出的12小时高保真印相交付链

更多请点击: https://intelliparadigm.com 第一章:【可口可乐全球设计中心认证流程】:从Prompt工程到DPI输出的12小时高保真印相交付链 可口可乐全球设计中心(Coca-Cola Global Design Hub)采用端到端AI增强型印前认证…...

YOLO26缝合SA(Spatial Attention):纯空间维度的特征图清洗与提炼

前沿洞察:2026年初,Ultralytics创始人Glenn Jocher在YOLO Vision 2025大会上正式发布YOLO26,定义为“生产级视觉AI的结构性飞跃”。与此同时,空间注意力(Spatial Attention, SA)作为一种“即插即用”的特征提纯手段,正以极低的计算代价重构YOLO的Neck与Head。当YOLO26遇…...

使用DSP280049的CLB做LLC硬件同步整流

一、根据epwm1a配置1pwm2a。一)搭建自己的第一部分clb结构如下:1.配置输入配置clb输入,配置输入选择epwm1a的zero与compA。input0是上升沿,input1是下降沿。2.配置计数器配置计数器,计数器重新计数配置成pwm1a上升沿。…...

2024 Q2全球AI搜索基准测试TOP3结果泄露:Perplexity在长尾专业查询中胜率68.4%,但ChatGPT在模糊意图理解上反超——你的团队该押注哪条技术路径?

更多请点击: https://intelliparadigm.com 第一章:2024 Q2全球AI搜索基准测试TOP3结果深度解读 本季度由MLPerf与AI Index联合发布的AI搜索基准测试(SearchBench v2.1)覆盖了17个主流模型,在真实网页索引、多跳推理、…...

FPGA与CPU电源时序测试技术解析与实践

1. FPGA与CPU电源时序测试的核心挑战在现代电子系统中,FPGA、MCU和CPU等处理器件的电源设计堪称"心脏手术"。我曾参与过多个Xilinx UltraScale和Intel Stratix 10项目的电源验证,深刻体会到毫秒级的时序偏差就可能导致数千美元的芯片瞬间损毁。…...

高速PCB设计实战:五种端接方案如何选型与优化

1. 高速PCB设计中的信号完整性问题 在高速PCB设计中,信号完整性(SI)问题就像城市交通拥堵一样常见。想象一下,当信号以GHz级别的频率在电路板上传输时,就像高峰期的高速公路上飞驰的跑车,任何一个小小的阻抗…...

【LangChain】 输出解析器(Output Parsers)完全指南

LangChain 输出解析器(Output Parsers)完全指南2026 年最新版 | 覆盖所有内置解析器 完整代码示例一、什么是输出解析器 输出解析器是 LangChain 中连接"自由文本 LLM"与"结构化程序"的桥梁。LLM 天生输出自然语言,但应…...

AI设计风格Prompt实战指南:从32种风格词典到精准生成

1. 项目概述:一份给AI设计师的“风格词典”如果你和我一样,经常用 Claude、Cursor 或者 v0 这类 AI 工具来生成网页界面,那你肯定遇到过这个头疼的问题:脑子里想的是“赛博朋克”或者“瑞士风格”,但打出来的 prompt 却…...

AI Agent思维文件版本控制:mindkeeper工具的设计原理与实战指南

1. 项目概述:为AI的“大脑”打造时光机如果你正在使用像OpenClaw这样的AI助手框架,或者任何基于Markdown文件来定义AI行为、记忆和技能的项目,那么你一定经历过这样的时刻:为了优化AI的回复风格,你反复调整了SOUL.md里…...

避坑指南:Arduino驱动四位七段数码管时,SevSeg库配置与硬件接线的那些细节

Arduino四位七段数码管避坑实战:从乱码到稳定显示的进阶指南 当你兴奋地按照教程连接好Arduino和四位七段数码管,上传代码后却发现显示乱码、部分段不亮或者亮度不均——这可能是每个创客都会经历的"成人礼"。本文将带你深入SevSeg库的配置细节…...

SAR ADC性能优化:电压基准设计与THD改善方案

1. 电压基准对SAR ADC性能的影响机制在精密数据采集系统设计中,工程师们常常花费大量精力选择高性能的模数转换器(ADC)和优化输入驱动电路,却容易忽视一个关键因素——电压基准的质量及其驱动能力。对于逐次逼近型(SAR)ADC而言,基准电压的稳定…...

ARM嵌入式开发:硬件抽象层与调试监控技术解析

1. ARM嵌入式开发中的硬件抽象层与调试监控在ARM嵌入式系统开发中,硬件抽象层(HAL)和调试监控器是两大核心基础设施。它们如同汽车的底盘和仪表盘——HAL负责统一管理发动机、变速箱等硬件组件,而调试监控器则提供实时运行数据与交…...

C语言核心知识体系总结

C语言核心知识体系总结本文旨在系统梳理C语言的基础与进阶知识点,帮助读者建立清晰的知识框架。内容涵盖:程序编译过程、数据类型与变量、运算符与表达式、控制结构、函数、指针、结构体与共用体、动态内存分配、文件操作等。适合复习巩固或查漏补缺。第…...

基于MCP的AI智能体:用自然语言轻松管理TikTok广告投放

1. 项目概述:用AI智能体玩转TikTok广告投放 如果你正在做跨境电商、品牌出海,或者任何面向年轻消费者的生意,TikTok广告绝对是你绕不开的战场。但真正上手后,你会发现事情没那么简单:TikTok的广告后台(Ads…...

基于RAG的本地知识库聊天机器人:anything-llm部署与实战指南

1. 项目概述:一个能“消化”任何文件的本地知识库聊天机器人最近在折腾本地大模型应用的朋友,可能都绕不开一个痛点:如何让大模型“读懂”并“记住”我自己的文档?无论是PDF报告、Word文档、网页文章,还是代码片段&…...

阿里:时序课程解决多轮蒸馏不稳定

📖标题:TCOD: Exploring Temporal Curriculum in On-Policy Distillation for Multi-turn Autonomous Agents 🌐来源:arXiv, 2604.24005v3 🛎️文章简介 🔸研究问题:如何在多轮自主智能体场景中…...

会话搜索服务器实战:从架构设计到生产部署的完整指南

1. 项目概述与核心价值最近在折腾一个挺有意思的玩意儿,叫session_search_server。这名字乍一看有点抽象,但如果你做过聊天机器人、客服系统,或者任何需要处理多轮对话、历史记录查询的应用,那你肯定遇到过类似的痛点:…...

为AI智能体构建长期记忆系统:零配置集成与四通道混合检索实践

1. 项目概述:为AI智能体装上“长期记忆”在AI智能体(Agent)的开发与使用中,一个长期存在的痛点就是“健忘症”。无论是基于OpenAI API还是本地部署的大模型,标准的对话模式都是无状态的——每次交互对于模型来说都是一…...

AI Agent Harness Engineering 未来生态:开源 vs 闭源的竞争与合作格局

AI Agent Harness Engineering 未来生态:开源 vs 闭源的竞争与合作格局 引言:AI Agent不是终点,Harness才是通用智能落地的核心阀门 1.1 从“AI大模型(LLM)元年”到“AI Agent生态元年”:技术拐点的悄然发…...

C++ 入门核心语法|从 Hello World 到基础特性一次性吃透

文章目录前言一、C 第一个程序:Hello World二、命名空间 namespace1. 为什么需要命名空间?2. 命名空间定义规则3. 三种使用方式三、C 输入 & 输出1. 核心对象2. 最大优势四、缺省参数(默认参数)1. 定义2. 使用方式3. 声明与定…...

半导体技术评估:如何判断新技术从概念到产品的“露点”

1. 开篇:从“露点”看半导体行业的虚实迷雾 大家好,我是Don Scansen。在半导体行业摸爬滚打了二十多年,从设计、验证到失效分析,几乎把产业链的各个环节都趟了一遍。今天,我想借这个新开的专栏,和大家聊聊一…...

德国工业4.0工程师指南:从系统融合到职业发展

1. 项目概述:为什么德国是工业工程师的理想目的地?如果你是一名工业、自动化或机器人领域的工程师,正在寻找一个能将你的技术抱负与前沿产业实践深度结合的职业舞台,那么德国很可能就是你一直在寻找的答案。这不仅仅是因为德国拥有…...

商业航天崛起:从SpaceX看工程创新与政策博弈的融合

1. 商业航天崛起的时代背景与技术逻辑2012年5月,当SpaceX的“龙”飞船与国际空间站成功对接时,我正和几位航天领域的同行在会议室里盯着直播画面。那一刻的安静与随后爆发的掌声,不仅仅是为一次技术成功,更是为一个新时代的开启感…...

从纸质手册到智能助手:技术会议应用如何重塑信息获取与时间管理

1. 从混乱到有序:技术会议体验的痛点与变革契机如果你参加过像国际电子器件会议(IEDM)或国际固态电路会议(ISSCC)这样的大型学术盛会,你肯定对那种“甜蜜的烦恼”深有体会。面对五六个并行进行的专题分会场…...