差分、前缀

差分与前缀

定义一个序列$a$,它的差分序列为$b_n=a_n-a_{n-1}$(后向差分),前缀和序列为$b_n=b_{n-1}+a_n$,显然,差分与前缀和互为逆运算,这意味着,对差分序列求前缀和就是原序列;同理,对前缀和序列求差分也是原序列。

重要结论

1、如果有了前缀序列,我们就可以O(1)求出$[l,r]$的区间和等于$b_r-b_{l-1}$

2、如果有了差分序列,对$[l,r]$区间加$d$就意味着$b_l+d,b_{r+1}-d$

来看一道题:

对于数列$a$,$Q$次形如$[l,r]$中所有的数$+d$的操作,最后输出改动后的数列

如果你很巨,会树状数组或线段树,Orz

我们仿照2操作,O(1)的时间内对差分序列做修改,因为差分与前缀和互为逆运算,对最后的差分序列做前缀就OK啦。

不仅只能做加法,只要有逆运算的运算都可以差分与前缀和,比如前缀积(乘的逆运算是除)和异或(异或的逆运算是异或)差分。

二维差分与前缀

画个图推推就好了呀

前缀矩阵$b_{i,j}=b_{i-1,j}+b_{i,j-1}-b_{i-1,j-1}+a_{i,j}$。

对$(x_1,y_1)(x_2,y_2)$这个子矩阵$+d$即差分矩阵$b_{x_2,y_2}+d,b_{x_1-1,y_2}-d,b_{x_2,y_1-1}-d,b_{x_1-1,y_1-1}+d$

对$(x_1,y_1)(x_2,y_2)$这个子矩阵即前缀矩阵$b_{x_2,y_2}-b_{x_1-1,y_2}-b_{x_2,y_1-1}+b_{x_1-1,y_1-1}$

其余的:树状数组,树上差分

原文地址:https://www.cnblogs.com/soledadstar/p/11600711.html

时间: 2024-10-17 14:49:49

差分、前缀的相关文章

HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】

Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 895    Accepted Submission(s): 387 Problem Description Given a simple unweighted graph G (an undirected graph containing no loops nor

HDU 5419——Victor and Toys——————【线段树|差分前缀和】

Victor and Toys Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 654    Accepted Submission(s): 219 Problem Description Victor has n toys, numbered from 1 to n. The beauty of the i-th toy is wi

(模板)差分&&前缀和

差分数组在acm中有很广泛的应用.对于原数组a:1 2 3 5 5,其差分数组就是sub:1 1 1 2 0,即每一项与前一项的差.其性质有: 差分数组求前缀和能得到原数组 对区间[l,r]上都加上d在差分数组上表现为sub[l]+=d , sub[r+1]-=d 进一步的,在[l,r]上加上首项为k,公差为d的等差数列,在差分数组的表现为sub[l]+=k , sub[i]+=d (l+1<=i<=r) , sub[r+1]-=k+(r-l)*d 对于上述第三条性质,如果是离线维护区间加等比

POJ - 3263 差分+前缀和

只需不断维护相对值的前缀就能得到解 这种思想第一次是在树状数组区间更新那里看到的,由于题目要求是1~n所以直接可以用前缀和维护 注意不能直接-1 +1 还有POJ的数据..要不是书里有提谁知道会这么毒瘤 /*H E A D*/ int delta[maxn]; map<P,int> vis; int main(){ int n,I,h,r,a,b; while(~iin(n)){ I=read();h=read();r=read(); memset(delta,0,sizeof delta);

二维差分前缀和——cf1202D(好题)

直接枚举每个点作为左上角是可以做的,但是写起来较麻烦 有一种较为简单的做法是对一列或一行统计贡献 比如某一行的B存在的区间是L,R那么就有三种情况 1.没有这样的区间,即一行都是W,此时这行对答案的贡献一直是1 2.R-L+1<=k,那么这一段必须要找一个点代表的矩形来覆盖,可以求出这样的点的存在区间是一个矩形,当且仅当点在这个矩形范围内时,这一行会有1的贡献. 3.R-L+1>k,永远不会有贡献 对于情况2,我们用二维的差分来统计一下,最后枚举每个点,看我们选择这个点代表的矩形时,贡献是否达

【差分+前缀和】BZOJ1637: [Usaco2007 Mar]Balanced Lineup

Description Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000)和种族(0或1). 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相也不例外.他只给一部分牛照相,并且这一组牛的阵容必须是“平衡的”.平衡的阵容,指的是在一组牛中,种族0和种族1的牛的数量相等. 请算出最广阔的区间,使这个区间内的牛阵容平衡.区间的大小为区间内最右边的牛的坐标

前缀和&amp;差分

一:差分数组概念 一.差分数组的定义及用途 1.定义:对于已知有n个元素的数列d,建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1].//f[i]数组为差分数组,d[i]数组为原数组 2.简单性质:(1)计算数列各项的值:观察d[2]=f[1]+f[2]=d[1]+d[2]-d[1]=d[2]可知,d[i]=f[i]的前缀和.(2)计算数列每一项的前缀和:第i项的前缀和即为数列前i项的和,那么推导可知 /

NOIP2012借教室[线段树|离线 差分 二分答案]

题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没

差分简单题集

[一维差分]Codeforces 1000C Covered Points Count 题目大意: 给定$n$个线段,给定这些线段所在的区间($l,r\leq10^{18}$),这些线段能够覆盖它们所包含的点,问你被包含$[1,n]$次的点分别有多少个. 解题分析:用差分来高效的统计一下指定区间内所被覆盖的线段个数,同时,因为$l,r$的大小非常大,所以我们需要对所有的线段进行离散化. #include <bits/stdc++.h> using namespace std; template

Codeforces Round #419 (Div. 2) A-E

上紫啦! E题1:59压哨提交成功翻盘 (1:00就做完了调了一个小时,还好意思说出来? (逃)) 题面太长就不复制了,但是配图很可爱所以要贴过来 九条可怜酱好可爱呀 A - Karen and Morning 询问从当前时刻过多久,时间会形成回文串的形式. 暴力呀暴力 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<