首页 > 其他分享 >差分

差分

时间:2023-12-11 09:45:37浏览次数:27  
标签:std 前缀 int sum 差分 数组

P2367 语文成绩

P2367 语文成绩 - 洛谷

暴力模拟过不了,时间复杂度是 \(\operatorname O(n^2)\)。

差分思想

  • 对于数组 \(a\),定义 \(a\) 的差分数组为 \(b\),其中 \(b_1 = a_1, b_i = a_i - a_{i - 1}(2\leq i\leq n)\)
\(i\) 1 2 3 4 5 6 7 8
\(a_i\) 1 1 2 2 1 3 3 5
\(b_i\) 1 0 1 0 -1 2 0 2
  • 对数组 \(b\) 求前缀和:

    \[\sum_{i = 1}^n b_i = a_1 + \sum_{i = 2}^n(a_i - a_{i - 1}) = \sum_{i =1}^n a_i - \sum_{i = 1}^{n-1}a_i = a_n \]

  • 可以发现

    • 若将 \(b_x\) 增加 \(1\),再对 \(b\) 数组求前缀和得到 \(a\) 数组,那么得到的 \(a\) 数组中 \(a_x, a_{x+1},\dots ,a_n\) 均增加 \(1\)。

    • 若将 \(b_y\) 减少 \(1\),再对 \(b\) 数组求前缀和得到 \(a\) 数组,那么得到的 \(a\) 数组中 \(a_y, a_{y+1},\dots ,a_n\) 均减少 \(1\)。

    • 例如,对于一个全为 \(0\) 的差分数组 \(b\),若将 \(b_3\) 增加 \(1\),将 \(b_6\) 减少 \(1\),得到的 \(a\) 数组如表所示:

      \(i\) 1 2 3 4 5 6 7 8
      \(b_i\) 0 0 +1 0 0 -1 0 0
      \(a_i\) 0 0 1 1 1 0 0 0
  • 因此,将 \(a\) 数组中第 \(x\) 元素到第 \(y\) 元素增加 \(z\) 的修改操作,可以转化为将 \(b_x\) 增加 \(z\),\(b_{y + 1}\) 减少 \(z\),最后再对 \(b\) 数组求前缀和。

  • 这样,对于每次修改操作,只需要修改 \(2\) 个点,时间复杂度变为 \(\operatorname O(1)\)。

  • 同时,因为只有在最后一次修改操作才需要得到 \(a\) 数组的具体值,所以只需要所有修改操作结束后求一次前缀和即可。

代码实现

#include<iostream>
#include<algorithm>
#include<cstdio>

const int N = 5e6 + 10;

int n, m, x, y, z, a[N], b[N];

int main()
{
 	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	std::cin >> n >> m;
	for (int i = 1; i <= n; i++) std::cin >> a[i], b[i] = a[i] - a[i - 1];
	for (int i = 1; i <= m; i++)
	{
		std::cin >> x >> y >> z; b[x] += z, b[y + 1] -= z; 
	}
	int min = 0x7fffffff;
	for (int i = 1; i <= n; i++)
	{
		b[i] += b[i - 1]; min = std::min(min, b[i]);
	}
	std::cout << min;
	return 0;
}

标签:std,前缀,int,sum,差分,数组
From: https://www.cnblogs.com/kdlyh/p/17893701.html

相关文章

  • 前缀和/差分——acwing算法基础课笔记
    个人笔记,欢迎补充,指正。一维前缀和对于数组:a[1],a[2],a[3]...a[n];其前缀和数组为s[i]=a[1]+a[2]+...+a[i];下标必须从1开始求前缀和1for(inti=1;i<n;++i)2s[i]=s[i-1]+a[i];s[0]需要定义为0作用求原数组里一段数(l,r)的和......
  • 【差分数组】我的日程安排表
    一、我的日程安排表I题目链接:我的日程安排表I实现一个MyCalendar类来存放你的日程安排。如果要添加的日程安排不会造成重复预订,则可以存储这个新的日程安排。当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。日程可以用一对整数......
  • CCF认证——202109-2 贡献的变化——差分维护,前缀和算答案
    https://www.acwing.com/problem/content/4010/http://118.190.20.162/view.page?gpid=T130脑子一热抱着玩的心态试了一下三分,当然炸了,就当初认识三分了。正解是考虑p的变化的影响,p变成p+1的时候,答案的值取决于p属于相邻递增数对的值域区间的数量。也可以考虑递减的情况,两......
  • 差分算法总结
    差分是前缀和的逆运算一维差分对于a1,a2,…,an,构造b1,b2,…,bn,使得ai= b1+ b2 + …+bi。此时,b数组成为a数组的差分,a数组称为b数组的前缀和。题目链接:https://www.acwing.com/problem/content/799/代码模版:1#include<iostream>23usingnamespacestd;45co......
  • 【图论】差分约束与SPFA 11.25学习小结
    开篇碎碎念每次都是以开篇碎碎念开头,虽然不知道为什么,但似乎成为了惯例。本来是直接看的差分约束,一上来发现一堆不等式,以为是数学的一个tag乱入图论(x,结果发现还真的是建图来做的,然后学了一下之后...负边权?!跑不了dijkstra啊!!于是学了一下SPFA(虽然...SPFA已死)然后顺道写了一下关于......
  • 前缀和、差分
    前缀和、差分前缀和可以快速求区间和。差分相当于前缀和的逆运算。前缀和、差分都是以空间换时间的算法前缀和定义前缀和可以简单理解为「数列的前n项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。一维前缀和题目一LuoguP8218【深进1.例1】求区间和#in......
  • 单端信号和差分信号
    单端信号和差分信号是两种常见的数字信号传输方式:单端信号:-使用单线传输信号,地线作为参考电平。-发送端将数字信号直接发送到传输线上。-接收端根据传输线上的电平高低判断数字信号是1还是0。-优点是实现简单,只需要一条传输线。-缺点是易受外界电磁干扰,传输距离较短。差分......
  • 差分与前缀和学习笔记
    本来是不想写这篇博客的,但为了课前十分钟还是来水一发前缀和简介继续引用OI-Wiki的话(OI-Wiki$yyds$!):前缀和可以简单理解为「数列的前$n$项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。也就是说,我们能使用$O(n)$的时间进行预处理,在$O(1)$的时间内求出......
  • 差分约束学习指南
    典题集合前置芝士求解差分约束系统,有m条约束条件,每条都为形如\((x_a-x_b\geqc_k)\),\((x_a-x_b\leqc_k)\)或\(x_a=x_b\)的形式,判断该差分约束系统有没有解。题意转化连边\((x_a-x_b\geqc)\)\((x_b-x_a\leq-c)\)add(a,b,-c);\(("x_a-x_b\leq......
  • cf1864D. Matrix Cascade(差分)
    https://codeforces.com/contest/1864/problem/D结论很好猜,直接从上到下做就行我们可以维护差分数组,表示对下面的影响,逐行往下推就行,当然+和-要分开,因为一个是往前推,一个往后推。时间复杂度\(O(n^2)\)#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>......