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

前缀和与差分算法详解

文章目录

  • 一维前缀和
  • 二维前缀和:
  • 一维差分
  • 二维差分:

前缀和与差分,互为逆运算,前缀和是构造一个新数组,新数组是旧数组的前缀和,而差分是构造一个新数组,新数组的前缀和是旧数组,这是他们之间的关系。

一维前缀和

#include<iostream>
using namespace std;
const int N=100010;int a[N];
long long sum[N];//这里的long long不要丢,前缀和可能很大int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];while(m--){int l,r;scanf("%d%d",&l,&r);printf("%d\n",sum[r]-sum[l-1]);}return 0;
}

记住核心的一句:
sum[r]-sum[l-1]

二维前缀和:

//子矩阵的和
#include<iostream>
using namespace std;
const int N=1010;
int n;//行数
int m;//列数
int q;//q个询问
int a[N][N];
long long sum[N][N];int main()
{cin>>n>>m>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)//关键1:sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+a[i][j];for(int i=1;i<=q;i++){int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;//关键2:cout<<sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]<<endl;}return 0;
}

一维差分

#include<iostream>
using namespace std;
const int N=100010;int n;//n是长度
int m;//m个操作
int a[N];//整数序列
int b[N];//差分序列,保存的是序列每一项与前一项的差值void insert(int l,int r,int c)
{b[l]+=c;b[r+1]-=c;
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++)b[i]=a[i]-a[i-1];while(m--){int l,r,c;cin>>l>>r>>c;insert(l,r,c);}for(int i=1;i<=n;i++)a[i]=b[i]+a[i-1];for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}

二维差分:

//二维差分
#include<iostream>
using namespace std;const int  N=1010;int a[N][N],b[N][N],n,m,q;void insert(int x1,int y1,int x2,int y2,int c)
{b[x1][y1]+=c;b[x1][y2+1]-=c;b[x2+1][y1]-=c;b[x2+1][y2+1]+=c;
}int main()
{cin>>n>>m>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)b[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];while(q--){int x1,y1,x2,y2,c;cin>>x1>>y1>>x2>>y2>>c;insert(x1,y1,x2,y2,c);}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)a[i][j]=a[i][j-1]+a[i-1][j]-a[i-1][j-1]+b[i][j];for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cout<<a[i][j]<<" ";puts("");}return 0;
}

前缀和比较好想,差分不太好想。想不起来的时候可以看看这个图解:
在这里插入图片描述

http://www.dtcms.com/a/266061.html

相关文章:

  • 线程池相关介绍
  • SpringSecurity01
  • 【libm】 7 双精度正弦函数 (k_sin.rs)
  • 从混沌到澄明,AI如何重构我们的决策地图与未来图景
  • 把大象塞进冰箱总共分几步:讲讲dockerfile里conda的移植
  • IOC容器讲解以及Spring依赖注入最佳实践全解析
  • XILINX FPGA如何做时序分析和时序优化?
  • Linux之Socket编程Tcp
  • 【BurpSuite 2025最新版插件开发】基础篇7:数据的持久化存储
  • snail-job的oracle sql(oracle 11g)
  • 百度捂紧“钱袋子”
  • 冒泡排序及其优化方式
  • Javaweb - 10.1 Servlet
  • 两个手机都用同个wifi,IP地址会一样吗?如何更改ip地址
  • Redis实战:数据安全与性能保障
  • linux测试端口是否可被外部访问
  • ROS三维环境建模——基于OctoMap库
  • c++ 的标准库 --- std::
  • 【25-cv-07436】Keith律所代理《Four Season - Winter Breeze》画作维权!
  • NFSv4 ACL配置与参数
  • ubuntu防火墙使用
  • 【ChatTTS】ChatTTS使用体验
  • 关于系统无法找到 arm-linux-gcc 命令,这表明你的环境中尚未安装 ARM 交叉编译工具链。以下是详细的解决方案:(DIY机器人工房)
  • 通过HBA卡新增外接存储,详细流程
  • R 语言安装使用教程
  • Oracle面试题-体系结构
  • 《dlib库中的聚类》算法详解:从原理到实践
  • ABP VNext + Cosmos DB Change Feed:搭建实时数据变更流服务
  • 计算机科学导论(10)什么是BIOS
  • 探秘展销编辑器:相较于传统展销的卓越优势与甄选指南​