Tido 习题-二叉树-树状数组实现

题目描述

这就是一个简单的树状数组入门题

可以动态地进行区间和查询

随时可能会进行更新

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
int C[100005];
int n,m;
int lowbit(int x){
    return x&(-x);
}
void add(int x,int d){
    while(x<=n){
        C[x]+=d;
        x+=lowbit(x);
    }//修改是从左往右
}
int sum(int x){
    int ret=0;
    while(x>0){
        ret+=C[x];
        x-=lowbit(x);//求和是从右往左
    }
    return ret;
}
int main()
{

    cin>>n>>m;
    for(int i=1;i<=n;i++) {
        int x;
        cin>>x;
        add(i,x);
    }
    for(int i=1;i<=m;i++){
        int k,a,b;
        cin>>k>>a>>b;
        if(k==1)
            add(a,b);
        if(k==0)
            cout<<sum(b)-sum(a-1)<<endl;
    }
    return 0;
}

如果对树状数组的一些基础知识还不太了解

可以先看一下https://www.cnblogs.com/Tidoblogs/p/10887644.html

原文地址:https://www.cnblogs.com/Tidoblogs/p/10887657.html

时间: 2024-08-30 14:38:14

Tido 习题-二叉树-树状数组实现的相关文章

Tido 习题-二叉树-树状数组求逆序对

这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述   样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示    #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<string> #include<cstring> using namespace std; struct lisan

树状数组彻底入门

int lowbit(int t) { return t&(-t); } void add(int x,int y) { for(int i=x;i<=n;i+=lowbit(i)) tree[i]+=y; } int getsum(int x) { int ans=0; for(int i=x;i>0;i-=lowbit(i)) ans+=tree[i]; return ans; } 这篇笔记 会详细的讲解,使得队员们对树状数组彻底入门  而不是懵懵懂懂. 以上先给出 最常见的,三个

poj 3321 Apple Tree(树状数组)

辉煌北大的月赛题质量真高啊,这种树状数组真难想到. 树状数组的基本用法是区间,单点的应用,起初这个怎么都想不到如何套用到树状数组. 转化方法是 将树上的节点信息查询,转为深度优先中节点顺序(代表结点编号).进结点与出结点分别代表该结点管辖范围. 题目大意级是说,给你一颗树,最初每个节点上都有一个苹果,有两种操作:修改(即修改某一个节点,修改时这一个节点苹果从有到无,或从无到有)和查询(查询某一个节点他的子树上有多少个苹果). 由于此题数据比较大(N<=10^5),而且不是标准的二叉树,所以这里我

tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着身体. 描述 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵.第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作.第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作.第

【BZOJ3132】上帝造题的七分钟 树状数组

[BZOJ3132]上帝造题的七分钟 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. 第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作. 第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围. 第五分钟,和雪说,要有耐心,于是便有了时间限制. 第六分钟,吃钢琴男说,要省点事,于是便有了保证运算过程中

POJ 2309 BST(树状数组Lowbit)

题意是给你一个满二叉树,给一个数字,求以这个数为根的树中最大值和最小值. 理解树状数组中的lowbit的用法. 说这个之前我先说个叫lowbit的东西,lowbit(k)就是把k的二进制的高位1全部清空,只留下最低位的1,比如10的二进制是1010,则lowbit(k)=lowbit(1010)=0010(2进制),介于这个lowbit在下面会经常用到,这里给一个非常方便的实现方式,比较普遍的方法lowbit(k)=k&-k,这是位运算,我们知道一个数加一个负号是把这个数的二进制取反+1,如-1

树状数组和线段树

一.树状数组 在解题过程中,我们有时需要维护一个数组的前缀和 S[i]=A[1]+A[2]+...+A[i] .但是不难发现,如果我们修改了任意一个 A[i],S[i] . S[i+1]...S[n] 都会发生变化.可以说,每次修改 A[i] 后,调整前缀和 S[] 在最坏情况下会需要 O(n) 的时间.当 n 非常大时,程序会运行得非常缓慢.因此,这里我们引入"树状数组",它的修改与求和都是 O(logn) 的,效率非常高. 实现: 对于正整数x,定义lowbit(x)为x的二进制表

树状数组与线段树

一:树状数组 树状数组是对一个数组改变某个元素和求和比较实用的数据结构.两中操作都是O(logn). 需求:有时候我们需要频繁地求数组的前k项和或者求数组从小标i到j的和,这样每次最坏情况下的时间复杂度就会为O(N),这样效率太低了.而树状数组主要就是为了解决这样一个问题.树状数组在求和及修改都可以在O(lgN)时间内完成. 树状数组需要额外维护一个数组,我们设为C[N],原数组为A[N], 其中每个元素C[i]表示A[i-2^k+1]到A[i]的和,这里k是i在二进制时末尾0的个数.注意通过位

hdu 6133---Army Formations(启发式合并+树状数组)

题目链接 Problem Description > Stormtroopers were the assault/policing troops of the Galactic Empire. Dissenting citizens referred to them as bucketheads, a derogatory nickname inspired by the bucket-shaped helmets of stormtroopers. They wore white armor