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

前缀和与差分

时间:2023-08-27 23:46:13浏览次数:33  
标签:x1 前缀 int d% 差分 x2 y1 y2

前缀和

一维前缀和

公式:

\[s[i] = s[i - 1] + a[i] \]

模板:

const int N = 10000 + 10;

int n,m;
int a[N],s[N];

int main() {
	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--) {
		int l,r;
        scanf("%d%d",&l,&r);
        printf("%d\n",s[r] - s[l - 1]);
    }
    return 0;
}

二维前缀和

公式:

\[求前缀和:s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j]\\ 算子子矩阵和:s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1] \]

模板:

const int N = 10000 + 10;

int n,m,q;
int a[N][N],s[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]);
            s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
        }
    }
    
    while (q--) {
        int x1,y1,x2,y2;
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        printf("%d\n",s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);
    }
    return 0;
}

差分

一维差分

公式:

\[b[l]\ +=\ c\quad b[r + 1]\ -=\ c \]

模板:

const int N = 10000 + 10;

int n,m;
int a[N],b[N];

void insert(int l,int r,int c) {
    b[l] += c;
    b[r + 1] -= c;
}
int main() {
	scanf("%d%d",&n,&m);
    for (int i = 1; i <= n; i++) {
        scanf("%d",&a[i]);
        insert(i,i,a[i]);
    }
    
    while (m--) {
		int l,r,c;
        scanf("%d%d%d",&l,&r,&c);
        insert(l,r,c);
    }
    
    for (int i = 1; i <= n; i++) {
        b[i] += b[i - 1];
        printf("%d ",b[i]);
    }
    return 0;
}

二维差分

公式:

\[b[x1][y1]\ +=\ c\quad b[x1][y2 + 1]\ -=\ c\\ b[x2 + 1][y1]\ -=\ c\quad b[x2 + 1][y2 + 1]\ +=\ c \]

模板:

const int N = 10000 + 10;

int n,m,q;
int a[N][N],b[N][N];

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() {
	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]);
            insert(i,j,i,j,a[i][j]);
        }
    }
    
    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++) {
			b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
            printf("%d ",b[i][j]);
        }
        puts("");
    }
    return 0;
}

标签:x1,前缀,int,d%,差分,x2,y1,y2
From: https://www.cnblogs.com/-37-/p/17661133.html

相关文章

  • 学习笔记413—python实现BP神经网络进行预测和误差分析(附源代码)
    python实现BP神经网络进行预测和误差分析(附源代码)反向传播算法也称为BP神经网络,是一种带有反馈的神经网络反向学习方法,它可以对神经网络的各层上的各个神经元的各个神经元之间的连接权重进行不断迭代修改,使神经网络将输入数据转换成期望的输出数据 BP神经网络的学习过程由正向......
  • 多阶前缀和学习笔记
    例题传送门:P4062[Code+#1]Yazid的新生舞会简要题意:给定一串序列\(A_1,A_2,...,A_n\),求有多少个子区间\([l,r]\)满足子区间内众数的个数大于\(\frac{r-l+1}{2}\)思考若数\(w\)是众数的方案数:新建一个序列\(B\),令\(B_i=[A_i=w]\),考虑前缀和\(S_i=\sum\limits_{k=1}^iB_i=S_{i-1......
  • Dirichlet 前缀和学习笔记
    传送门求\(b_k=\sum\limits_{i|k}{a_i}\)考虑\(i=p_1^k,j=p_1^{k+1}\),若我们已经求出了\(b_i\),则易知\(b_j=b_i+a_j\)然后根据上面的方法,考虑对于所有的\(k=p_1^{k1}p_2^{k2}...p_l^{kl}\),若\(j=p_2^{k2}...p_l^{kl}\),我们已经求出所有的\(c_k=a_j+a_{p1\timesj}+a_{p1^2\time......
  • 8.Acwing基础课第795题-简单-前缀和
    8.Acwing基础课第795题-简单-前缀和题目描述输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l,r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含......
  • 11.Acwing基础课第795题-简单-前缀和
    11.Acwing基础课第795题-简单-前缀和题目描述输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数,,,,c,其中(,)和(,)表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上c。请你将进行完所有操作后的矩阵输出。输......
  • 10.Acwing基础课第797题-简单-差分
    10.Acwing基础课第797题-简单-差分题目描述输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l,r,c,表示将序列中[l,r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数序列......
  • Redis如何批量删除指定前缀的key
    批量删除指定前缀的Key有两中方法,一种是借助redis-cli,另一种是通过SCAN命令来遍历所有匹配前缀的key,并使用DEL命令逐个删除它们。redis-cli使用Redis自带的redis-cli命令行工具,你可以通过以下方式批量删除指定前缀的key:redis-cliKEYS"your_prefix*"|xargsredis......
  • 2023-08-23 vuetifyjs icon用法 ==》 前缀mdi-加上icon名称
    我现在用的是最新3.0版本的vuetifyjs,它的icon库来自......
  • 字典树(前缀树)求区间异或和(异或对)最大值
    字典树(前缀树)求区间异或和(异或对)最大值求子区间异或对最大值求子区间异或对的最大值,利用前缀树可以在每次询问对子区间内的每个元素在O(logn)的时间内得到答案,执行n此的时间花费为O(nlogn),而得到答案需要已经建立前缀树,而每次询问答案都需要重新建立一棵前缀树,每次建树最坏情......
  • 二维前缀和和差分
    二维前缀和和差分1.二维前缀和\[s_{i,j}=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}\]\[s_{x_2,y_2}-s_{x_1-1,y_2}-s_{x_2,y_1-1}+s_{x_1-1,y_1-1}\]前缀和推广例题:有\(n\)个数,找出\(n-1\)个数,使得最大公因数最大解法:枚举\(n\)个数,不选一个,找出前缀公约数和后缀公约数,然......