【每日基础算法】树状数组 - 动态求连续区间和

简介: 【每日基础算法】树状数组 - 动态求连续区间和

【每日基础算法】树状数组 - 动态求连续区间和


博主介绍

功能

操作

案例:动态求连续区间和

树状数组

💫点击直接资料领取💫


博主介绍

🌊 作者主页:苏州程序大白


🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创始之一,目前合作公司富士康、歌尔等几家新能源公司


💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦


💅 有任何问题欢迎私信,看到会及时回复

💅关注苏州程序大白,分享粉丝福利


273354cca6cc4e638e4742d78f4b4a92.png


功能


让某个位置上的数加上一个数


求某一个前缀和


操作


lowbit(x):返回x的最后一位1


add(x,v):在x位置加上v,并将后面相关联的位置也加上v


query(x):询问x的前缀和


c[x]:表示的区间和是(x−lowbit(x),x]


add(x,k)操作


需要让后面所有包含元素区间和都增加K


for (int i = x; i <= n; i += lowbit(i)) {
   c[i] += k;
}


query(x)操作


需要累加X前面全部的元素,每个包含了i - lowbit(i))的数


for (int i = x; i; i -= lowbit(i)) {
    sum += c[i];
}


0daae99e776a455b844051f1558b994b.png


案例:动态求连续区间和


给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列[a,b]的连续和。


输入格式


第一行包含两个整数 n 和 m,分别表示数的个数和操作次数。


第二行包含n个整数,表示完整数列。


接下来 m 行,每行包含三个整数k, a, b(k = 0,表示求子数列[a, b]的和;k = 1,表示第 a 个数加b)。


数列从1开始计数。


输出格式


输出若干行数字,表示k=0 时,对应的子数列[a, b]的连续和。


数据范围


1≤n≤100000,


1≤m≤100000,


1≤a≤b≤n,


数据保证在任何时候,数列中所有元素之和均在 int 范围内。


输入样例:


10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8


输出样例:


11
30
35


树状数组


#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int c[N];
//lowbit返回二进制第一个非零的1
int lowbit(int x) {
    return x & -x;
}
//在第x个位置上,加上k
void add(int x, int k) {
    for (int i = x; i <= n; i += lowbit(i)) c[i] += k;
}
//返回x的前缀和
int query(int x) {
    int res = 0;
    for (int i = x; i; i -= lowbit(i)) res += c[i];
    return res;
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        int x;
        scanf("%d", &x);
        add(i, x);
    }
    while (m--) {
        int k, a, b;
        scanf("%d %d %d", &k ,&a, &b);
        if (k) add(a, b);
        else printf("%d\n", query(b) - query(a - 1));
    }
    return 0;
}


相关文章
|
6月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
6月前
|
人工智能 算法 BI
class077 区间dp-下【算法】
class077 区间dp-下【算法】
53 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
39 0
|
存储 算法 C++
C++基础算法离散化及区间合并篇
C++基础算法离散化及区间合并篇
157 0
|
5月前
|
存储 SQL 算法
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
|
5月前
|
存储 算法 搜索推荐
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
|
5月前
|
算法
基于仿射区间的分布式三相不对称配电网潮流算法matlab仿真
```markdown # 摘要 本课题聚焦于基于仿射区间的分布式三相配电网潮流算法在MATLAB2022a中的仿真。算法利用仿射运算处理三相不平衡情况及分布式电源注入,旨在提供比区间算法更精确的不确定区域。仿真结果展示了算法优势。核心程序设计考虑了PQ、PV及PI节点,将不同类型的节点转换统一处理,以适应含分布式电源的配电网潮流计算需求。 ``` 这个摘要以Markdown格式呈现,总字符数为233,满足了240字符以内的要求。
|
6月前
|
算法 C++
c++算法学习笔记 (12) 区间合并
c++算法学习笔记 (12) 区间合并
|
6月前
|
存储 机器学习/深度学习 人工智能
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
|
6月前
|
人工智能 算法
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
下一篇
无影云桌面