美文网首页
前缀和与差分

前缀和与差分

作者: madao756 | 来源:发表于2020-03-12 12:05 被阅读0次

0X00 一维前缀和

n, m = map(int, input().split())
nums = list(map(int, input().split()))
sums = [0] * (n+1)

for i in range(1, n+1):
    sums[i] = sums[i-1] + nums[i-1]
    
for _ in range(m):
    n1, n2 = map(int, input().split())
    print(sums[n2] - sums[n1-1])

0X01 二维前缀和

n, m = map(int, input().split())
nums = list(map(int, input().split()))
sums = [0] * (n+1)

for i in range(1, n+1):
    sums[i] = sums[i-1] + nums[i-1]
    
for _ in range(m):
    n1, n2 = map(int, input().split())
    print(sums[n2] - sums[n1-1])

0X02 一维差分

一维差分推导:

假设我们有数组 a[a_1, a_2, ..., a_n] 现在构造一个数组 b 使得:[a_1, a_2 - a_1, ..., a_n - a_{n -1}] 那么 b 的前 n 项和就是 a_n 并且如果我们向 b_k 增加一个数 c 那么再求 a_ka_n 的时候都会加上一个 c。因此我们完成了在 O(1) 的时间给一段数加上某一个数

现在我们来写它的模板:

差分只有一个操作 add,就是给一段区间加上一个值,

def add(l, r, v):
    b[r+1] -= v
    b[l] += v
n, q = map(int, input().split())
a = list(map(int, input().split()))
b = [0] * (n+1)

def add(l, r, v):
    b[r+1] -= v
    b[l] += v

for i, v in enumerate(a):
    add(i, i, v)

# print(b)
while q > 0:
    q -= 1
    l, r, v = map(int, input().split())
    add(l-1, r-1, v)

0X03 二维差分

构造一个二维数组 b 使得 b 的二维前缀和是 a

同样只有一个操作记住下面这张图:

想要绿色部分的 a 在 o(1) 的时间内全部加上 c 则只需要在 b 的图中 +c 的位置 +c -c 的位置 -c。就可以了

def add(x1,y1, x2, y2, v):
  b[x1][y1] += v
  b[x2+1][y1] -= v
  b[x1][y2+1] -= v
  b[x2+1][y2+1] += v

相关文章

  • 前缀和与差分

    0X00 一维前缀和 0X01 二维前缀和 0X02 一维差分 一维差分推导: 假设我们有数组 a 现在构造一个数...

  • 前缀和 差分

    1.前缀和 原题链接[https://www.acwing.com/problem/content/101/] 这...

  • 差分&&前缀和

    前缀和 区间和 记住一个n+1(方便操作) i-1(因为是和相减,所以不能包括i) 一维 二维 pre数组同样变成...

  • 4月

    算法基础课 排序()二分()高精度()前缀和与差分()双指针算法()位运算(), 离散化()区间合并() 链表与...

  • 差分数组 -- Java版

    差分 已知前缀和 S[n], 构造 b[n] 满足条件: S[i] = b1 + b2 + … + b[n] 差分...

  • 一些用前缀思想解决的题(持续完善)

    有前缀和, 前缀GCD, 前缀奇数个数, 前缀偶数个数, 前缀差, 等等, 都要根据自己的思想来去解决!!!,前缀...

  • Binary Index Tree

    二维差分: 单点修改/询问前缀和: 区间修改/询问区间: 二维树状数组:

  • Leetcode1109. 航班预订统计

    前言 最近leetcode的每日刷题都是前缀和类的,比较有连贯性。没有上来搞个hard打击人。本题用到了差分、前缀...

  • 二维前缀和和差分

    讲二维之前现得知道什么是前缀和,用例题来了解会更好 题目描述:有个数列a1、a2...an,m 次求任意 [l,r...

  • 二十三、elasticSearch前缀搜索/通配符/ngram分

    1、前缀搜索 前缀越短,要处理的doc越多,性能越差,尽可能用长前缀搜索,前缀搜索会进行全扫,就和数据库中的全表扫...

网友评论

      本文标题:前缀和与差分

      本文链接:https://www.haomeiwen.com/subject/vrfujhtx.html