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

前缀和与差分

时间:2022-09-04 20:25:35浏览次数:54  
标签:前缀 int sum d% 差分 1005 include

前缀和

一维前缀和

前缀和数组

d[i]=d[i-1]+a[i];

前缀和公式

sum=a[r]-a[l-1];

模版

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int n,m,a[100005],x,y,d[100005];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        d[i]=d[i-1]+a[i];
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        printf("%d\n",d[y]-d[x-1]);
    }
    return 0;
}

二维前缀和

区间和公式

sum[xb][yb]-sum[xa-1][yb]-sum[xb][ya-1]+sum[xa-1][ya-1];

前缀和公式

sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];

模版

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int n,m,k,a[1005][1005],sum[1005][1005],xa,ya,xb,yb;
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
		}
	}
	for(int i=1;i<=k;i++){
		scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
		printf("%d\n",sum[xb][yb]-sum[xa-1][yb]-sum[xb][ya-1]+sum[xa-1][ya-1]);
	}
    return 0;
}

差分

一维差分

数组

d[i]=a[i]-a[i-1];

公式

a[l]+=x;
a[r+1]-=x;

模版

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int n,m,a[100005],l,r,x,sum[100005];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		sum[i]=a[i]-a[i-1];
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&l,&r,&x);
		sum[l]+=x;
		sum[r+1]-=x;
	}
	for(int i=1;i<=n;i++){
		sum[i]+=sum[i-1];
		printf("%d ",sum[i]);
	}
    return 0;
}

二维差分

公式

sum[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];//求差分 
sum[xa][ya]+=c;
sum[xa][yb+1]-=c;
sum[xb+1][ya]-=c;
sum[xb+1][yb+1]+=c;
//对于每次操作 

模版

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int n,m,q,xa,ya,xb,yb,c,a[1005][1005],sum[1005][1005],ans[1005][1005];
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]);
			sum[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];
		}
	}
	for(int i=1;i<=q;i++){
		scanf("%d%d%d%d%d",&xa,&ya,&xb,&yb,&c);
		sum[xa][ya]+=c;
		sum[xa][yb+1]-=c;
		sum[xb+1][ya]-=c;
		sum[xb+1][yb+1]+=c;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1]+sum[i][j];
			printf("%d ",ans[i][j]);
		}
		printf("\n");
	}
    return 0;
}

标签:前缀,int,sum,d%,差分,1005,include
From: https://www.cnblogs.com/hnzzlxs01/p/16655919.html

相关文章

  • 差分
    https://leetcode.cn/problems/shifting-letters-ii/1classSolution{2public:3stringshiftingLetters(strings,vector<vector<int>>&shifts){4......
  • 牛客dfs专题:轰炸区最优选取(二维前缀和)
    链接:https://ac.nowcoder.com/acm/problem/14505来源:牛客网题目描述现在给出一个正方形地图,其边长为n,地图上有的地方是空的,有的地方会有敌人。我们现在有一次轰炸敌人......
  • 差分约束
    其实就是spfa话说看spfa的时候突然发现我原来判负环的板子是锅的然后wa了好几次就是形如\(x_i-x_j\lek\)的一群问题。我们发现把这个东西移个项之后变成了\[x_i\lex_......
  • letcode算法--9.最长公共前缀
    编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog......
  • 差分约束
    差分约束模板:P5960【模板】差分约束算法-洛谷|计算机科学教育新生态(luogu.com.cn)例题:Problem-7176(hdu.edu.cn)有n个未知数,m个不等式.将所有不等式化......
  • 前缀树的设计与实现
    前缀树的设计与实现作者:Grey原文地址:博客园:前缀树的设计与实现CSDN:前缀树的设计与实现前缀树即字典树,可以利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字......
  • 差分约束:求最小->求所有下界的最大->最长路 √
    最长路如果有正环就输出无解a>b那么b到a连一条长度为1的边结论:一个正环一定是某个scc中的对于某个scc中的所有边,只要又一个边的权重是严格>0因为u+w->bw>0又u和v......
  • 方差分析、T检验、卡方分析如何区分?
    差异研究的目的在于比较两组数据或多组数据之间的差异,通常包括以下几类分析方法,分别是方差分析、T检验和卡方检验。三个方法的区别其实核心的区别在于:数据类型不一样。......
  • Gym 101775J Straight Master(差分数组)
    题意:给你n个高度,再给你1n每种高度的数量,已知高度连续的35个能消去,问你所给的情况能否全部消去;例:n=4,给出序列1221表示高度1的1个,高度2的2个,高度3的2个,高度4的1个。那......
  • 2022牛客多校 第9场 C Global Positioning System(讨论+lca+树上差分)
    传送门若干条路径生成了一个无向连通图,只有所有简单回路对应的向量为\(0\)向量时合法。需要改变的边是满足这个边是所有不为\(0\)回路的交且不属于所有为\(0\)的回路。......