前缀和&&差分


前言

小课堂这次讲的前缀和 和 差分,听得比较懂,所以才可以来记录一下。前缀和 和 差分数组是互逆的。


一、前缀和

前缀和就是从1开始到第i个数的和
优点是可以用前缀和来快速求解一个区间的和

for(int i=1;i<=n;i++)
{
     cin>>a[i];
     s[i]=s[i-1]+a[i];
}

二、差分

差分的话就是可以分为一维的差分和二维的差分

一维差分

给你一串一维数组,然后让你在l,r的区间上的每一个数字都加上x,但是这个操作只给你O(n)的时间范围才可以,请问你会怎么做呀?
那么操作就是
再开一个差分数组,在l上加上x,在r+1上减去x,然后输出每个值的时候a[i]=a[i]+a[i-1]

二维差分

那么二维差分就是会有(x1,y1),(x2,y2),那么就是(x1,y1)(x1+1,y1+1)加上x,(x1,y2+1)(x2+1,y1)减去x

接下来就是例题啦!
地毯

#include<bits/stdc++.h>
using namespace std;
int a[1005][1005];
int main() {
	int n,m;
	int x1,x2,y1,y2;
	cin>>n>>m;
	while(m--){
		cin>>x1>>y1>>x2>>y2;
		a[x1][y1]++;
		a[x1][y2+1]--;
		a[x2+1][y1]--;
		a[x2+1][y2+1]++;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
			cout<<a[i][j];
			if(j!=n){
				cout<<" ";
			}
		}
		cout<<endl;
	}

	
	return 0;
	
}


总结

That’s all for it!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值