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

前缀和、差分

时间:2023-11-22 23:55:51浏览次数:39  
标签:前缀 int scanf d% 差分 ++

前缀和、差分

前缀和可以快速求区间和。
差分相当于前缀和的逆运算。
前缀和、差分都是以空间换时间的算法

前缀和

定义
前缀和可以简单理解为「数列的前 n 项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。

一维前缀和

题目一

Luogu P8218 【深进1.例1】求区间和

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], s[N];
int main(){
    int n, m;
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++ ) {
        scanf("%d", &a[i]);
        s[i] = s[i - 1] + a[i];
    }
    scanf("%d", &m);
    while(m -- ){
        int l, r;
        scanf("%d%d", &l, &r);
        printf("%d\n", s[r] - s[l - 1]);
    }
    return 0;
}

题目二

Acwing 795. 前缀和

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], s[N];
int main(){
    int n, m, l, r;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++ ) {
        scanf("%d", &a[i]);
        s[i] = s[i - 1] + a[i];
    }
    while(m -- ){
        scanf("%d%d", &l, &r);
        printf("%d\n", s[r] - s[l - 1]);
    }
    return 0;
}

二维前缀和

题目一

AcWing 796. 子矩阵的和

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, m, q;
int a[N][N];
int main(){
    scanf("%d%d%d", &n, &m, &q);
    for(int i = 1; i <= n; i ++ ){
        for(int j = 1; j <= m; j ++ ){
            scanf("%d", &a[i][j]);
            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
        }
    }
    int x1, y1, x2, y2;
    while(q -- ){
        scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
        printf("%d\n", a[x2][y2] - a[x2][y1 - 1] - a[x1 - 1][y2] + a[x1 - 1][y1 - 1]);
    }
    return 0;
}

题目二

Luogu P2280 [HNOI2003] 激光炸弹

#include<bits/stdc++.h>
using namespace std;
const int N = 5e3 + 2;
int s[N][N];
int main(){
    int n, m, x, y, v;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i ++ ){
        scanf("%d%d%d", &x, &y, &v);
        x ++ , y ++ ;
        s[x][y] += v; // 每个攻击目标都具有v价值,攻击目标有可能重复
    }
    for(int i = 1; i < N; i ++ ){
        for(int j = 1; j < N; j ++ ){
            s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
        }
    }
    int res = 0;
    for(int i = m; i < N; i ++ ){
        for(int j = m; j < N; j ++ ){
            res = max(res, s[i][j] - s[i - m][j] - s[i][j - m] + s[i - m][j - m]);
        }
    }
    printf("%d", res);
    return 0;
}

差分

定义
差分是一种和前缀和相对的策略,可以当做是求和的逆运算。

一维差分

题目一

Acwing 797. 差分

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main(){
    int n, m, l, r, c, t;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++ ){
        scanf("%d", &t);
        a[i] += t; // 求差分数组, 相当于b[i] = a[i] - a[i - 1];
        a[i + 1] -= t;
    }
    while(m -- ){
        scanf("%d%d%d", &l, &r, &c);
        a[l] += c;
        a[r + 1] -= c;
    }
    for(int i = 1; i <= n; i ++ ){
        a[i] += a[i - 1];
        printf("%d ", a[i]);
    }
}

题目二

Luogu P4552 [Poetize6] IncDec Sequence

TODO

二维差分

题目一

AcWing 798. 差分矩阵

TODO

标签:前缀,int,scanf,d%,差分,++
From: https://www.cnblogs.com/zshsboke/p/17850313.html

相关文章

  • 单端信号和差分信号
    单端信号和差分信号是两种常见的数字信号传输方式:单端信号:-使用单线传输信号,地线作为参考电平。-发送端将数字信号直接发送到传输线上。-接收端根据传输线上的电平高低判断数字信号是1还是0。-优点是实现简单,只需要一条传输线。-缺点是易受外界电磁干扰,传输距离较短。差分......
  • 差分与前缀和学习笔记
    本来是不想写这篇博客的,但为了课前十分钟还是来水一发前缀和简介继续引用OI-Wiki的话(OI-Wiki$yyds$!):前缀和可以简单理解为「数列的前$n$项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。也就是说,我们能使用$O(n)$的时间进行预处理,在$O(1)$的时间内求出......
  • acwing 第 130 场周赛  (前缀和,dfs,对不同边的处理)
      #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<climits>usingnamespacestd;typedeflonglongLL;constintN=5010;intn;inta[N];LLs[N];LLget(intl,intr){return......
  • 前缀和
    前缀和1.前缀和简介前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,(而差分可以看成前缀和的逆运算).合理的使用前缀和与差分,可以将某些复杂的问题简单化。2.前缀和好处求数组的某个区间的和时,最容易想出暴力算法,遍历区间求和,时间复杂度为O(n*m)而使用前缀......
  • 差分约束学习指南
    典题集合前置芝士求解差分约束系统,有m条约束条件,每条都为形如\((x_a-x_b\geqc_k)\),\((x_a-x_b\leqc_k)\)或\(x_a=x_b\)的形式,判断该差分约束系统有没有解。题意转化连边\((x_a-x_b\geqc)\)\((x_b-x_a\leq-c)\)add(a,b,-c);\(("x_a-x_b\leq......
  • 哈夫曼编码及前缀码的实现
    哈夫曼编码我们的任务是选一篇英语文章统计每个字符的概率,并实现哈夫曼前缀编码所选文章内容:lifeistooshorttospendtimewithpeoplewhosuckthehappinessoutofyouifsomeonewantsyouintheirlifetheyllmakeroomforyouYoushouldnthavetofightfor......
  • cf1864D. Matrix Cascade(差分)
    https://codeforces.com/contest/1864/problem/D结论很好猜,直接从上到下做就行我们可以维护差分数组,表示对下面的影响,逐行往下推就行,当然+和-要分开,因为一个是往前推,一个往后推。时间复杂度\(O(n^2)\)#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>......
  • DHCPv6 PD(Prefix Delegation)前缀代理
    概念DHCPv6前缀代理DHCPv6PD(PrefixDelegation)是一种前缀分配机制,通过DHCPv6前缀代理机制,下游网络设备不需要再手工指定用户侧链路的IPv6地址前缀,它只需要向上游网络设备提出前缀分配申请,上游网络设备便可以分配合适的地址前缀给下游设备,下游设备把获得的前缀再通过路由通告(RA)......
  • 数据分析之方差分析
    方差分析(AnalysisofVariance,简称ANOVA)是一种统计方法,用于比较两个或多个样本均值之间的差异。它可以帮助我们确定某个因素(自变量)对于观测值(因变量)的影响程度是否显著。在数据分析中,方差分析被广泛应用于实验设计和比较研究中。下面我将详细介绍方差分析的原理、步骤和应用。......
  • 数据加WJ前缀
    你好,我将给你一个地址,请你遍历地址和地址下所有子文件夹,里面有很多图片名称,如"Goldwatch_Bluehexagonaldial_Goldnumbersandpointers_Goldstrap"每个下划线作为分割的符号,下划线间的字符作为一个单元。如:“Goldwatch_Bluehexagonaldial_Goldnumbersandpointers......