首页 > 其他分享 >霸道总裁重生之他要学习——《前缀和》

霸道总裁重生之他要学习——《前缀和》

时间:2025-01-15 17:29:08浏览次数:3  
标签:return 前缀 get ## sum 霸道 重生 presum

前言

这是笔者备考蓝桥杯自己做的学习相关内容,或有不准确,欠妥的部分,请谅解,如有问题,欢迎评论,也欢迎在评论区留言备考蓝桥杯的相关心得,寻找一同学习的学习搭子,加油同志们!

一、一维前缀和

1、一维前缀和的定义与性质

定义:sum[i]表示数组a的前i个数的和,即为前缀和,一维前缀和习惯从0开始

sum[i] = a[0] + a[1] + ... + a[i]

性质:可以在O(1)的复杂度内进行一个区间的判断、求值

#递推求前缀和
sum[i] = sum[i-1]+a[i]
#前缀和可以用来求一个区间的
a[l] + ... + a[r] = sum[r] - sum[l - 1]

2、一维前缀和的实现

(1)实现方式——循环

##求前缀和的函数
def get_presum(a):
    n = len(a)
    Sum = [0] * n
    Sum[0] = a[0]
    for i in range(1,n):
        Sum[i] = Sum[i - 1] + a[ i ]
    return Sum
​
##在O(1)的时间复杂度中获取一个a[l] + .... a[r]
def get_sum(sum,l,r):
    if l==0:
        return sum[r]
    else:
        return sum[r]-sum[l-1]
    
a = [1,2,3,4,5]
sum = get_presum(a)
print(sum)    

(2)实现方式—迭代器

ps:注意,迭代器默认是从0开始,如果你构建的数组想要从1开始,请先进行调整

##迭代器构建前缀和
from itertools import accumulate
def get_presum_iter(a):
    sum = list(accumulate(a))
    return sum
##在O(1)的时间复杂度中获取一个a[l] + .... a[r]
def get_sum(sum,l,r):
    if l==0:
        return sum[r]
    else:
        return sum[r]-sum[l-1]
a = [1,2,3,4,5]
sum = get_presum(a)
print(sum)  

二、二维前缀和

1、二维前缀和的定义与性质

定义:二维前缀和的下标习惯从1开始,所以一般情况下,会采取在最左边和最上面留出一列、一行[0],某一个点的前缀和是:以这个点向左向上围成的一个矩阵的和

sum[i][j] =     a[1][1]+...+a[1][j]
            +   a[2][1]+...+a[2][j]
            +           ...
            +   a[i][0]+...+a[i][j]

性质:求一个矩阵的内和

如下图所示,现在有一个二维矩阵,我现在想求黄色区域的所有数的和,我要怎么做?

(请你思考一下呢?)

这里,我们用(x2,y2)-(x1,y1)来代表黄色区域

(x2,y2)-(x1,y1) = sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1-1][y1-1]

其中:sum[x2][y1-1]是紫色区域 ,sum[x1-1][y2]是粉色区域,有一个区域多减去了,再给它加回来

2、二维前缀和的实现

def get_presum(a):
##    获取行数
    n = len(a)
##    获取列数
    m = len(a[0])
##    构建一个前缀和数组
    sum = [[ 0 ] * ( m + 1 ) for _ in range( n + 1 )]
    for i in range( 1 , n + 1 ):
        for j in range( 1 , m + 1 ):
##            PS:这里用a[i-1][j-1]是因为a的坐标是从0开始的,但是i,j是从1开始的
##            简单来说就是,没有办法取到a[0][*]的一行以及a[*][0]的一列
##            根本原因是因为,sum数组在最上方和最左边增加了[0]行(列)
##            但是a没有添加上
##            如果出现题目,需要自己输入,可以这样,满足上面添一行0,左边添一列0:
##            for i in range(1,n+1):
##                a[i] = [0] + list(map(int,input().split()))
            sum[i][j] = sum[ i - 1 ][ j ] + sum[ i ][ j - 1 ] - sum[ i - 1 ][ j - 1 ] + a[ i - 1 ][ j - 1 ]
    return sum
​
a = [[ 1, 2, 3, 4],[5, 6, 7, 8]]
sum = get_presum(a)
print(sum)

三、例题

1、区间次方和

点击此处前往“区间次方和”

2、小郑的蓝桥平衡串

点击此处前往“小郑的蓝桥平衡串”

3、统计子矩阵(70分做法)

点击此处前往“统计子矩阵(70分做法)”

标签:return,前缀,get,##,sum,霸道,重生,presum
From: https://blog.csdn.net/2203_75805636/article/details/145159517

相关文章

  • 【优先算法】思还故里闾,欲归道无因 - 前缀和
    本篇博客给大家带来的是前缀和算法的知识点,也是一样通过OJ题理解,掌握,应用该算法.......
  • 前缀和和差分
    一、一维前缀和的作用大量的区间求和,把原始数组a的区间操作转换为前缀和的两点操作有一个数组{2,1,3,6,4},询问三次结果:1.数组第1到第2个元素的和是多少?2.数组第1到第3个元素的和是多少?3.数组第2到第4个元素的和是多少?num:index:012345 indexnum:array......
  • 前缀和和差分
    一、一维前缀和:前缀和数组作用????  大量的区间求和,把原始数组a的区间操作转换为前缀和的两点操作有一个数组{2,1,3,6,4},询问三次结果:1.数组第1到第2个元素的和是多少?2.数组第1到第3个元素的和是多少?3.数组第2到第4个元素的和是多少?num:index:012345 i......
  • Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
    CountArrays:一眼秒的计数题。思路显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是\(1\),就会形成一个基环树森林。那么考虑这个环上能填什么数。因为所有数都小于等于他后面的数,所以所有数都只能相等。这就启发我们在基环树上缩点之后再进行计数。那么当缩完点......
  • D - Coming of Age Celebration (前缀+差分)
    题目链接:https://atcoder.jp/contests/abc388/tasks/abc388_d题意:一共有n个外星人,每当有一个外星人成年后,成年的外星人就要给他一块钱(如果没钱就不给),返回操作后数组思路:模拟一下,可以把数组前面已经成年的外星人对下一个刚好要成年的外星人的钱数贡献记作前缀信息s,随着数......
  • Java-前缀树
        前缀树,也叫Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较。        Trie树的核心思想是空间......
  • 前缀和,差分与离散化
    前缀和:前缀和顾名思义一般是指数组中前n项的和,通常用另一个数组来存储,如定义一个前缀和数组prefix[n]表示的是a1+a2+--an,这与等差数列中的Sn有着相像之处,但如何用代码实现的呢?只需要定义一个前缀和数组--prefix[n]for(inti=1;i<=n;i++){prefix[i]=prefix[i-1]+a[i];}......
  • 随笔:我为什么没有把《P5369 [PKUSC2018] 最大前缀和》做出来
    这是一篇随笔(绝对不是某CC风格的随笔)特别提醒:某W同学,再被【数据删除】要求写【数据删除】时你可以看一看这个大纲。我在干什么我在考【数据删除】时,开完题目后,我断定我就要解决这一道题。看见\(20\)这个小范围以后我就想起上一把【数据删除】的T【数据删除】。我就想DP......
  • 208. 实现 Trie (前缀树)
    [题目链接](208.实现Trie(前缀树)-力扣(LeetCode))解题思路:前缀树,每个节点的内容:pre:经过该节点的数目;end:以该节点结尾的数目;nexts:下一条路径。前缀树有一个根节点,每次查找、插入、删除都要从这个节点开始。插入时,遍历该字符串,先从根节点开始,查看nexts是否有该字符,有就复......
  • 并行前缀(Parallel Prefix)加法器
    并行前缀(ParallelPrefix)加法器并行前缀加法器的基本介绍二进制加法器是目前数字计算单元中的重要模块,基础的加法器架构包括行波进位加法器(RippleCarryAdder),超前进位加法器(CarryLook-AheadAdder),进位选择加法器(CarrySelectAdder)等。加法器的进位传播是其组合延迟的主要来源......