首页 > 其他分享 >前缀和与差分

前缀和与差分

时间:2024-07-10 12:58:13浏览次数:13  
标签:前缀 int cin 差分 y1 y2

  • 前缀和与差分的联系

    前缀和与差分就是一个互逆的过程,前缀和数组反映了从头到i的差分数组的和,差分数组体现了前缀和数组相邻的变化量。

  • 矩阵前缀差分的理解

    可以根据矩形面积来理解

前缀和

#include<iostream>
using namespace std;
const int N = 1e5+10;
int n,m;
int l,r;
int q[N];
int s[N];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)//1开始,因为s[]需要i-1
    {
        cin>>q[i];
        s[i]=s[i-1]+q[i];
    }
    while (m--)
    {
        cin>>l>>r;
        cout<<s[r]-s[l-1]<<endl;
    }
    
    return 0;
}

矩阵前缀和

#include<iostream>
using namespace std;
const int N = 1e3+10;//科学计数法
int a[N][N];
int s[N][N];
int n,m,q;
int x1,y1,x2,y2;
int main(){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
        }
    }
    while(q--)
    {
        cin>>x1>>y1>>x2>>y2;
        cout<<(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1])<<endl;
    }
    return 0;
}

差分

#include<iostream>
using namespace std;
const int N = 1e5+10;
int n,m,l,r,c;
int a[N],s[N];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
        a[i]=s[i]-s[i-1];
    }
    while(m--)
    {
        cin>>l>>r>>c;
        a[l]+=c;
        a[r+1]-=c;
    }
    for(int i=1;i<=n;i++)
    {
        s[i]=s[i-1]+a[i];
        cout<<s[i]<<' ';
    }
    return 0;
}

矩阵差分

#include<iostream>
using namespace std;
const int N = 1010;
int n,m,q;
int x1,y1,x2,y2,c;
long long a[N][N],s[N][N];
int main(){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            cin>>s[i][j];
            a[i][j]=s[i][j]-s[i-1][j]-s[i][j-1]+s[i-1][j-1];
        }
    while(q--)
    {
        cin>>x1>>y1>>x2>>y2>>c;
        a[x1][y1]+=c;
        a[x2+1][y1]-=c;
        a[x1][y2+1]-=c;
        a[x2+1][y2+1]+=c;
        //差分矩阵一个点+c,代表右下角全部+c
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
            cout<<s[i][j]<<' ';
        }
        cout<<endl;
    }
    return 0;
}

标签:前缀,int,cin,差分,y1,y2
From: https://www.cnblogs.com/CryCoffeeCat/p/18293835

相关文章

  • 前缀和简析
    前缀和前置知识:\(\sum_{i=1}^{r}{a_i}=a_l+a_{l+1}+\dots+a_{r-1}+a_r\)考虑以下数组:\(i\)\(1\)\(2\)\(3\)\(a_I\)\(3\)\(5\)\(7\)如果我们要查询\(\sum_{i=1}^{2}{a_i}\),很显然可以得到\(\sum_{i=1}^{2}{a_i}=3+5=8\)。如果......
  • 差分离散化问题
    火烧赤壁题目背景曹操平定北方以后,公元208年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了。孙权任命周瑜为都督,拨给他三万水军,叫他同刘备协力抵抗曹操。隆冬的十一月,天气突然回暖,刮起了东南风。没想到东吴......
  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【前缀和/固定滑窗】2
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路贪心思想......
  • 详解前缀码与前缀编码
    前缀编码是一种数据压缩技术,也被称为可变长度编码。它的基本原理是将频繁出现的字符或字符序列用较短的编码表示,而较少出现的字符或字符序列用较长的编码表示,从而达到压缩数据的目的。概念定义前缀码:给定一个编码序列的集合,若不存在一个序列是另一个序列的前缀,则该序列......
  • n阶前缀和 の 拆解
    2阶\[\sum_{i=l}^{r}\sum^{i}_{j=1}a_j\]\[=\sum_{i=l}^{r}(r-i+1)a_i\]\[=(r+1)\sum_{i=l}^{r}a_i+\sum_{i=l}^{r}i\cdota_i\]这个很好理解,因为对于第\(i\)个数,他加了\((r-i+1)\)次三阶正常拆解\[\sum_{i=l}^{r}\sum^{i}_{j=1}\sum_{k}^{j}a_k\]\[=......
  • HT-014 Div3 扫雷 题解 [ 绿 ] [ 二维差分 ]
    分析观察到是曼哈顿距离\(\ler\)的范围可以扫到,联想到如下图形:左边是\(r=1\)可以扫到的范围,右边是\(r=2\)可以扫到的范围。于是,我们只要对这样的图形在\(1000*1000\)的格子里差分一下就好了。但这样的复杂度是\(O(nm)\)的,会死的很惨。优化不难发现这个图形是一......
  • 前缀和数组 差分数组
    前缀和一维:通过空间换时间适用于需要频繁查询某一段区间和的场景。一维数组:一维前缀和中的每一项:,该前缀和中的每一项也就是数组中对应的前i项和。一维前缀和数组的构造:在输入原数组时同步构造前缀和数组可以改写为  for(inti=1;i<=n;i++){scanf("%d",&arr[i......
  • 可视化二维函数的拉普拉斯算子 - 使用有限差分法来近似计算二维标量函数的拉普拉斯算
    可视化二维函数的拉普拉斯算子-使用有限差分法来近似计算二维标量函数的拉普拉斯算子flyfish算子(Operator)是指的是一个将函数、向量或其他对象映射到另一对象的数学实体。简单来说,算子就是一种“操作”或“变换”,它把一个输入(通常是函数或向量)变换成另一个输出。算子可......
  • [算法篇] 简单讲讲一维前缀和与差分
    前缀和:先给定义:指某序列的前n项和是不是与我们高中所学的数列求和类似?给出用途: 如我们于一组长度为n的整数序列中询问m次,每次询问中输出区间[l,r]中数之和倘若我们先不使用前缀和,预测一下思路将会是:m次询问中,每一次都求和数组[l,r]时间复杂度为O(n),思路很简单但若m非常大则将......
  • 多因素方差分析
    在多因素方差分析中,我们会遇到数据的组织,这个对后续SPSS进行分析特别重要,其中列联表的数据组织难倒了很多大学生,为此在这里,进行了总结:1.符号说明2.数据组织设置分组变量(以SPSS的分析为例)3.提出原假设H0:不同地区对商品的销售量均值无显著性影响,即dqi=0H0:不同日期对商品的......