前缀和差分模板
Posted 猪八戒1.0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前缀和差分模板相关的知识,希望对你有一定的参考价值。
目录
前缀和和差分是逆运算
一维前缀和
S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]
二维前缀和
S[i, j] = 第i行j列格子左上部分所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]
一维差分
下图数组a是数组b的前缀和,那么b数组就是a数组的差分
如果要给a区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c
import java.util.Scanner;
public class 一维差分
static int n,m;
static int a[]=new int[100010];
static int b[]=new int[100010];
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
for(int i=1;i<=n;i++)
a[i]=sc.nextInt();
insert(i,i,a[i]);
while(m>0)
m--;
int l,r,c;
l=sc.nextInt();
r=sc.nextInt();
c=sc.nextInt();
insert(l, r, c);
for(int i=1;i<=n;i++) b[i]+=b[i-1];
for(int i=1;i<=n;i++) System.out.print(b[i]+" ");
public static void insert(int l,int r,int c)
b[l]+=c;
b[r+1]-=c;
二维差分
给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:
S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c
import java.util.Scanner;
import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext;
public class 二维差分
static int n,m,q;
static int a[][]=new int[100010][100010];
static int b[][]=new int[100010][100010];
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
q=sc.nextInt();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=sc.nextInt();
insert(i,j,i,j,a[i][j]);
while(q>0)
q--;
int x1,y1,x2,y2,c;
x1=sc.nextInt();
y1=sc.nextInt();
x2=sc.nextInt();
y2=sc.nextInt();
c=sc.nextInt();
insert(x1, y1, x2, y2, c);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
//妈的那个巴子
b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
System.out.print(b[i][j]+" ");
private static void insert(int x1, int y1, int x2, int y2, int c)
b[x1][y1]+=c;
b[x2+1][y1]-=c;
b[x1][y2+1]-=c;
b[x2+1][y2+1]+=c;
以上是关于前缀和差分模板的主要内容,如果未能解决你的问题,请参考以下文章