首页 > 其他分享 >前缀和与差分

前缀和与差分

时间:2024-03-21 23:22:22浏览次数:26  
标签:underset 前缀 int 差分 数组 overset

​ 前缀和就是一直累加即可,可以用于非常极速\(O(1)\)的区间查询。

​ 差分则是取每两个相邻数字的差值,可以用于非常急速\(O(1)\)的区间修改,当然仅限加减。如果是乘除什么的建议去线段树

​ 差分做一次前缀和可以得到原数组,原数组再做一次前缀和就是前缀和......算了文字太绕了看下面的LaTeX吧:

\(差分\underset{差分}{\overset{前缀和}{\rightleftharpoons}}原数组\underset{差分}{\overset{前缀和}{\rightleftharpoons}}前缀和\)

#include<iostream>
using namespace std;
const int N = 100010;
int a[N];
int s[N];//前缀和数组
int d[N];//差分数组
int main()
{
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d", &a[i]);
        s[i] += s[i-1] + t;//上一个总和加现在的数得到当前总和
        
        d[i] = a[i] - a[i-1];//两个数之间的差值就是差分数组的目的
    }
    //对于查询而言,直接将查询区间头和尾的值相减即可。
    int l, r, v;
    while(1)
    {
        int command;
        scanf("%d%d%d%d", &command, &l, &r);/*假设1是前缀和的操作,2是修改区间的操作
        					两个修改的是两组不同数据,只是为了演示作用*/
        switch(command)
        {
            case 1:
                cout<<d[r] - d[l-1]<<endl; //查询从l到r的区间,因为包括了l,所以要往l-1位去找
                break;
            case 2:
                scanf("%d", &v);
                s[l]+=v;
                s[r+1]-=v;//因为区间修改从l到r,包括r,因此要往后一项去减去一个v
                //之所以要进行右端点减v,是因为修改的是一个区间,而差分修改一次会影响后面所有数据,所以在r+1的位置复原一次,保证后面区间不受影响。
                break;
        }
    }
    return 0;
}

标签:underset,前缀,int,差分,数组,overset
From: https://www.cnblogs.com/ComputerEngine/p/18088458

相关文章

  • 14. 最长公共前缀c
    booljudge(char*s1,char*s2,intn){for(inti=0;i<n;i++){if(s1[i]!=s2[i])returnfalse;}returntrue;}char*longestCommonPrefix(char**strs,intstrsSize){intcount=strlen(strs[0]);for(inti=1;i<strsSize;i++){......
  • 动态开点并查集+树上差分
    https://www.acwing.com/problem/content/description/2071/每次合并的时候需要开一个新点去实现信息的无后效性,也就是合并之前的两个连通块信息是无法共享的,发现这样开点连边最后形成一棵树,每次我们将信息传递到新点,也是两个合并点的lca,这使得最后求答案的直接求一边树上前缀和......
  • 前缀树问题
    图前缀树思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题来源:力扣208.实现Trie(前缀树)问题描述:Trie(发音类似"try")或者说前缀树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用......
  • 浅记高维前缀和
    考虑如下问题:记\(y\subsetx\leftrightarrowx\&y=y\)。若\(x\subsety\),称\(x\)为\(y\)的一个子集,\(y\)为\(x\)的一个超集。给定数组\(f\),求数组\(g\)。其中\(g_x=\sum_{y\subsetx}{f_y}\)。设\(f\)中最大的数二进制下共有\(n\)位。如果直接枚举子集的话,时......
  • 二维前缀和&二维差分(超详细,python版,其他语言也很轻松能看懂)
    上一篇文章讲解了一维前缀和&一维差分,本篇进阶为二维。二维前缀和:二维前缀和跟一维前缀和求法相同,这里直接上例子。数组a=[[1,2,2,1],[3,2,2,1],[1,1,1,1]]a数组如图:则数组a的前缀和为:数组b[[1,3,5,6],[4,8,12,14],[5,10,15,18]]b数组如图:前缀和递推公式为b[i][......
  • abc250E 判断集合前缀是否相等
    给定数组A[n]和B[n],有Q组询问,每次给出一组(x,y),问A中前x个元素构成的集合是否与B中前y个元素构成的集合相等?1<=n,q<=2e5;1<=a[i],b[i]<=1e9;1<=x[i],y[i]<=n可以用乘法和异或来实现对集合的哈希,另外需要借助一个set来避免重复元素对哈希结果的影响。#include<bits/stdc++.h>......
  • mysql索引(索引失效,遵循最左前缀,使用1.全值匹配 2.覆盖索引,失效:索引加函数,范围查询右边
    1.遵循联合索引最左列原则当表中创建了一个联合索引idx_name_age_position案例演示1.当我们在执行sql语句:以name为where条件时,我们可以用到索引EXPLAINSELECT*FROMemployeesWHEREname='LiLei';2.当我们在执行sql语句:以age为where条件时,索引就会失效......
  • 前缀和与差分
    前缀和:模版题:https://www.luogu.com.cn/problem/P8218二维前缀和:https://www.luogu.com.cn/problem/P2004前缀和应用:https://www.luogu.com.cn/problem/T430521前缀和应用二:https://www.luogu.com.cn/problem/T430522方法一:计算所有k的前缀和,要点:使用vector,效率nlogn其他......
  • [Python初阶]2255.统计是给定字符串前缀的字符串数目
    目录     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析③.startswith()方法理解与说明Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决⑤总结     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析需求:统计列表words中,是字......
  • Leecode 最长公共前缀
    Day1刷题此题没有写出来,仅附上力扣官方代码:classSolution{publicStringlongestCommonPrefix(String[]strs){if(strs==null||strs.length==0){return"";}Stringprefix=strs[0];intcount=strs.length;......