算法-3 区间求和

整体

  • 数组不变,区间查询:前缀和、树状数组、线段树;
  • 数组单点修改,区间查询:树状数组、线段树;
  • 数组区间修改,单点查询:差分、线段树;
  • 数组区间修改,区间查询:线段树

1 前缀和

  • 下标从1开始,好处理边界问题

一维前缀和

sum[i] = sum[i-1] + a[i]

二维前缀和

sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + matrix[i - 1][j - 1];

2 差分

一维差分

  • 在区间[l,r]中让数列都增加C
//a是sum的差分数组
int sum[n] = {}; [1,2,2,4]
int a[n] = {}; [1,1,0,2]
int c;
void dif(){
    //求差分数组
    for(i=1;i<=n;i++){
        a[i]=sum[i]-sum[i-1];
    }
    //在区间[l,r]中让数列都增加C
    a[l] += c;
    a[r + 1] -= c;
    //答案
    for(i=1;i<=n;i++){
        //sum[i] = sum[i - 1] + a[i];
        a[i]+=a[i-1];
    }
    
}

题目

二维差分

//a是sum的差分数组
int sum[n][m] = {};
int a[n][m] = {};
int c;
void dif(){
    for(int i = 1; i <= n; i++){
        for(int j = 1;j <= m; j++){
            cin >> sum[i];
            a[i][j]=sum[i][j]-sum[i-1][j]-sum[i][j-1] + sum[i-1][j-1];
        }
    }
    a[x1][y1] += c;
    a[x2+1][y1] -= c;
    a[x1][y2+1] -= c;
    a[x2+1][y2+1] += c;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j];
            //a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];  //二维前缀和
        }
    }
}

3 树状数组

基本概念

功能

  • 单点修改+区间查询
  • 最简单的树状数组支持两种操作,时间复杂度均为 O(logn)

代码

  • 下标从1开始,具体情况要转换
int lowbit(int x) {
    return x & -x;
}
//单点修改
int tree[MAXN];
void update(int index, int val)
{
    for (int i = index; i < MAXN; i += lowbit(i))
        tree[i] += x;
}

//求前n项和
inline int query(int index)
{
    int ans = 0;
    for (int i = index; i > 0; i -= lowbit(i))
        ans += tree[i];
    return ans;
}

//区间查询
inline int query(int a, int b)
{
    return query(b) - query(a - 1);
}

题目

线段树

讲解

//创建
//查询
//修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prince_H_23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值