(数组)前缀和、前缀积及其应用

什么是前缀和、前缀积?

前缀和、前缀积也称前缀和数组,前缀积数组。

给一数组A,

前缀和:新建一数组B,数组中每一项B[i]保存A中[0…i]的和;

后缀和:新建一数组B,数组中每一项B[i]保存A中[i…n-1]的和;

前缀积:新建一数组B,数组中每一项B[i]保存A中[0…i]的积;

后缀积:新建一数组B,数组中每一项B[i]保存A中[i…n-1]的积;

前缀和、前缀积的应用(例子):

1、题目1:

给定浮点数组a,求一数组b,b[i]=a[0]*a[1]*…*a[i-1]*a[i+1]*…*a[n-1],不能使用除法,不允许新开数组。

思路:

先求“后缀积”:

for(int i=n-1;i>=0;i—) b[i]=a[i]*((i==n-1)?1:b[i+1]);

顺带求“前缀积”:

for(int i=0,j=1;i<n;j*=a[i++]) b[i]=j*((i==n-1)?1:b[i+1]);

2、题目2:

求数组中连续一段和,绝对值最小?

思路:

前缀和的性质:a[i]+a[i+1]+…+a[j]=sum[j]-sum[i-1]

前缀和排序,取最小

3、题目3:

把一个数组从中间p位置分开,使得a[0]+…+a[p-1]与a[p]+a[p+1]+…+a[n-1]差值最小?

思路:

  • 前缀和-(总和-前缀和)=2*前缀和-总和,是该公式最小;
  • 如果都是非负数,可以采取“两头扫”的方法,和较小的那边多加一个数;
时间: 2024-10-07 18:31:10

(数组)前缀和、前缀积及其应用的相关文章

前缀积和后缀积

Description: 给出数列A1,A2,...,AN,并设 Bi = (A1 * A2 * A3 ... AN) / Ai mod (109 + 7) 现要求把所有的Bi 算出来 Input: 输入包含多组测试数据.对于每组数据,第1 行,1 个整数N(1 ≤N ≤100,000), 表示数列的长度.第2 行,N 个整数A1,A2,...,AN(1 ≤Ai≤109),表示给出的数列.输入以一个 0 表示结尾. Output: 对于每组数据,输出一行,N 个整数用空格分隔,表示算出的B1,B

HDU 3336 Count the string (KMP next数组运用——统计前缀出现次数)

Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6375    Accepted Submission(s): 2947 Problem Description It is well known that AekdyCoin is good at string problems as well as nu

树状数组差分求前缀和的前缀和

既然我们知道树状数组可以差分求前缀和 那么就可以对其进行 前缀和 求变量值 展开可得 $(k+1)*\sum_{i}^n c[i]-\sum_{i}^n i*c[i]$ 两个 树状数组可以搞定 顺便提一下DFS序  可以将树上问题转化为区间问题 对节点重新编号 并且有从属关系  从而 利用各种数据结构 例如 树剖  树状数组解决 原文地址:https://www.cnblogs.com/OIEREDSION/p/11380443.html

HDU 5465——Clarke and puzzle——————【树状数组BIT维护前缀和+Nim博弈】

Clarke and puzzle Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 673    Accepted Submission(s): 223 Problem Description Clarke is a patient with multiple personality disorder. One day, Clarke s

C语言之基本算法35—数组上三角之积 主对角之积 副对角之积

//数组算法 /* ============================================================= 题目:求四阶矩阵上三角之积,主对角之积,副对角之积: 如: 8  3  6  5 0  4  3  2 0  6  1  5 7  0  0  2 上三角之积为:172800 主对角之积为:64 负对角之积为:630 ============================================================= */ #inc

最大子数组的和与积

最大子数组的和 double get_max_sum(double a[], int length) { double cursum = a[length - 1]; double maxsum = a[length - 1]; int curi = length - 2; while (curi >= 0) { cursum = max(a[curi], a[curi] + cursum); maxsum = max(cursum, maxsum); -- curi; } return max

创建二维数组(一维长度3,二维长度6),值为一维数组和二维数组索引值的积,

<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>二维数组</title><script type="text/javascript">var myarr = new Array(); for (var i = 1

(收藏)KMP算法的前缀next数组最通俗的解释

我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容. 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大.

bzoj4397【Usaco2015 Dec】Breed Counting(前缀和、树状数组)

题目描述 Farmer John's N cows, conveniently numbered 1…N, are all standing in a row (they seem to do so often that it now takes very little prompting from Farmer John to line them up). Each cow has a breed ID: 1 for Holsteins, 2 for Guernseys, and 3 for