首页 > 其他分享 >树状数组

树状数组

时间:2024-05-13 18:30:16浏览次数:11  
标签:树状 int tree cin add 数组 区间 op

一般用于单点修改,区间查询
模板:

const int N = 1e6 + 10;

int tree[N];

int lowbit(int x) {
    return x & -x;
}
void add(int x, int k) { // 修改
    while(x <= n) {
        tree[x] += k;
        x += lowbit(x);
    }
}
int find(int x) { // 查询
    int res = 0;
    while(x != 0) {
        res += tree[x];
        x -= lowbit(x);
    }
    return res;
}

对于单点修改,区间查询的完整代码:

#include <bits/stdc++.h>

using namespace std;

const int N = 5e5 + 10;

int tree[N];
int n, m;

int lowbit(int x) {
    return x & -x;
}
void add(int x, int k) {
    while(x <= n) {
        tree[x] += k;
        x += lowbit(x);
    }
}
int find(int x) {
    int res = 0;
    while(x != 0) {
        res += tree[x];
        x -= lowbit(x);
    }
    return res;
}

int main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i ++) {
        int t;
        cin >> t;
        add(i, t);
    }
    for(int i = 1; i <= m; i ++) {
        int op;
        cin >> op;
        if(op == 1) {
            int x, k;
            cin >> x >> k;
            add(x, k);
        }
        else {
            int x, y;
            cin >> x >> y;
            cout << find(y) - find(x - 1) << endl;
        }
    }
    return 0;
}

而对于区间修改,单点查询的题,只需要运用前缀和与差分的知识做一点小修改即可。

#include <bits/stdc++.h>

using namespace std;

const int N = 5e5 + 10;

int tree[N], a[N];
int n, m;

int lowbit(int x) {
    return x & -x;
}
void add(int x, int k) {
    while(x <= n) {
        tree[x] += k;
        x += lowbit(x);
    }
}
int find(int x) {
    int res = 0;
    while(x != 0) {
        res += tree[x];
        x -= lowbit(x);
    }
    return res;
}

int main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    for(int i = 1; i <= m; i ++) {
        int op;
        cin >> op;
        if(op == 1) {
            int x, y, k;
            cin >> x >> y >> k;
            add(x, k); // 根据差分只需要让 tree[x] + k 即可保证区间的值都加上了k
            add(y + 1, - k); // 到区间右端时,只需让 tree[x + 1] - k 即可保证区间以后的值不改变 
        }
        else {
            int x;
            cin >> x;
            cout << find(x) + a[x] << endl; // 查询的值即为数组的前缀和
        }
    }
    return 0;
}

标签:树状,int,tree,cin,add,数组,区间,op
From: https://www.cnblogs.com/yishujia/p/18189767

相关文章

  • 【LeetCode 410】分割数组的最大值
    题目描述原题链接:LeetCode.410分割数组的最大值解题思路分割的是连续子数组,所以模拟分割求子数组之和可以利用前缀和计算;设前缀和数组preSume[i]含义为[0,..,i]范围元素之和,某个子数组subArray[i,j]的元素和就是preSum[j]-preSum[i];求K个子数组元素和的最大值能转换......
  • 5.12数组角标
    使用递增操作符的数组输入,比如说intb[100],i=0;while(cin>>a){b[i++]=a;}//在这个代码中,i是从1开始存数的,也就是数的范围从b[1]开始,而不是0 对于排序,并且输出排序之后的角标的那种题,就可以看作排序前a[1]=12(数)a[1]=1a[1]=16a[1]=19a[1]=54b[1]=1(角标)b[2]=2......
  • 数组
    一、数组概述数组:由一组相同数据类型的数据组成的集合。数组其实就是用户向内核申请的一块空间,只不过内核提供的这块空间的内存地址是连续的目的就是方便用户存储数据和访问数据。二、数组定义数组的定义格式:数据类型数组名[元素个数];元素个数可以是常量、常量表达式......
  • js 遍历数组取出字符串用逗号拼接
    var arr=[{"name":"hhh"},{"name":"dddd"}] //用jsfunction getTextByJs(){    var str= "";    for (var i=0;i<arr.length;i++){        str+=arr[i].name+ ",";    }    //去掉最后一个逗号(如......
  • 基于spring boot Java的数组转树状结构类
    基于springboot的数组转树状结构类importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.List;importjava.util.function.Function;publicclassArray{private<E,V>VcreateViewObject(Eentity,Class<V>viewObjectClass)thro......
  • js数组常用方法
    一、改变原数组的方法       1.push()末尾添加数据       2.pop()末尾出删除数据       3.unshift()头部添加数据       4.shift()头部删除数据       5.reverse()翻转数组       6.sort()排序       7.splice() 截取数组  ......
  • 代码随想录训练营第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
    977.有序数组的平方题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep暴力解时间复杂度O(nlogn)空间复杂度O(1)双指针法时间复......
  • 2024-05-10 js 常用数组方法
    push():向数组的末尾添加一个或多个元素,并返回新的长度。pop():删除并返回数组的最后一个元素。shift():删除并返回数组的第一个元素。unshift():向数组的开头添加一个或多个元素,并返回新的长度。splice():通过删除或替换现有元素或者添加新元素来修改数组,并以数组形式返回被修改......
  • 代码随想录算法训练营第第二天 | 977.有序数组的平方 、27. 移除元素
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep/***@param{number[]}nu......
  • 53_Maximum Subarray-最大子数组
    问题描述Givenanintegerarray nums,findthe subarray withthelargestsum,andreturn itssum.给定一个数组nums,找到一个子数组。使它的和最大,返回子数组例子Input:nums=[-2,1,-3,4,-1,2,1,-5,4]Output:6Explanation:子数组[4,-1,2,1]有最大的和6.基......