当前位置: 首页 > news >正文

树状数组的基础

树状数组1

树状数组可以解决什么问题呢?
可以解决大部分区间上面的修改以及查询的问题,例如1.单点修改,单点查询,2.区间修改,单点查询,3.区间查询,区间修改,换言之,线段树能解决的问题,树状数组大部分也可以,但是并不一定都能解决,因为线段树的扩展性比树状数组要强.

在这里插入图片描述
为了更好的理解,下面咱们来看一道模板题点击跳转
在这里插入图片描述
显然,我们一开始会想到暴力的朴素做法,单点修改操作时间复杂度O(1),区间求和,暴力遍历区间每一个数再相加时间复杂度O(n),如果区间求和查询的次数为n次,那么中的时间复杂度为 O ( n 2 ) O(n^2) O(n2),对于大数据的题来说肯定会TLE,此时如果用树状数组的话复杂度可以讲到 O ( n l o g n ) . O(nlogn). O(nlogn).这时就要用到树状数组的奇妙了。
讲一些序列构建成树的形状,便于求和,便于增删,便于查找。
需要用到构建树状和查找结果两个函数,分别是

//构建函数
void add (int x,int y)
{while (x<=n){a[x]+=y;x+=lowbit(x);}
}
//查找函数
int search (int x)
{int ans=0;while (x){ans+=a[x];x-=lowbit(x);}return ans;
}

有了这两个函数,就易如反掌了写这个题。
这里说一下lowbit lowbit() 函数用来 取一个二进制最低位的一与后边的0组成的数。可以用来判断一个数是不是2的幂次方,我们可以直接在头文件直接定义它。
接下来直接附上我的代码

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
#define fi first
#define se second
#define PII pair<int,int> 
#define lowbit(x) (x&(-x))
using namespace std;
const int N=2e6+5;
int a[N];
int n,m;
void add (int x,int y)
{while (x<=n){a[x]+=y;x+=lowbit(x);}
}
int search (int x)
{int ans=0;while (x){ans+=a[x];x-=lowbit(x);}return ans;
}void solve()
{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 x,y,z;cin>>x>>y>>z;if (x==1) add(y,z);else {cout<<search(z)-search(y-1)<<'\n';}}return ;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T=1;//cin >> T;while(T--) solve();return 0;
}

是一个树状数组的板子题,记住就可以了。

树状数组2

在这里插入图片描述

接下来是另一种树状数组的例题,基本思路和树状数组1大差不差,其中有些思路不一样,主要还是用到了上面所写的两个函数

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
#define fi first
#define se second
#define PII pair<int,int> 
#define lowbit(x) (x&(-x))
using namespace std;
const int N=1e6+5;
int a[N],c[N];
int n,m;
void add (int x,int y)
{while (x<=n){c[x]+=y;x+=lowbit(x);}
}
int search (int x)
{int res=0;while (x){res+=c[x];x-=lowbit(x);}return res;
}
void solve()
{cin>>n>>m;for (int i=1;i<=n;i++){cin>>a[i];int x=a[i]-a[i-1];add(i,x);}for (int i=1;i<=m;i++){int x;cin>>x;if (x==1){int q,w,e;cin>>q>>w>>e;add(q,e);add(w+1,-e);}else if (x==2){int cnt;cin>>cnt;cout<<search(cnt)<<'\n';}}return ;
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T=1;//cin >> T;while(T--) solve();return 0;
}

相关文章:

  • 使用小黄鸟(HttpCanary)、VMOS Pro虚拟机对手机APP进行抓包(附带软件)
  • LeetCode题练习与总结:买卖股票的最佳时机--121
  • 4. 流程控制语句
  • 【软考的系统分析师的考题考点解析2025】
  • 【面试干货】MySQL 三种锁的级别(表级锁、行级锁和页面锁)
  • 力扣每日一题 6/8
  • expect自动化交互应用程序工具
  • 【文件导出2】导出html文件数据
  • C# 绘图及古诗填字
  • Android基础-进程间通信
  • 熟悉的软件架构风格及详细介绍
  • 自动驾驶人工智能
  • 【深度学习】之 卷积(Convolution2D)、最大池化(Max Pooling)和 Dropout 的NumPy实现
  • arm系统中双网卡共存问题
  • 区块链共识机制技术一--POW(工作量证明)共识机制
  • [LeetCode] Wiggle Sort
  • Java程序员幽默爆笑锦集
  • Rancher如何对接Ceph-RBD块存储
  • React Transition Group -- Transition 组件
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 面试总结JavaScript篇
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 用jQuery怎么做到前后端分离
  • 再谈express与koa的对比
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #100天计划# 2013年9月29日
  • #Linux(帮助手册)
  • (0)Nginx 功能特性
  • (06)Hive——正则表达式
  • (1)Nginx简介和安装教程
  • (1)STL算法之遍历容器
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (含笔试题)深度解析数据在内存中的存储
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)用.Net的File控件上传文件的解决方案
  • *上位机的定义
  • .bat批处理(一):@echo off
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 反射 Reflect
  • .NET 使用 XPath 来读写 XML 文件
  • .NET简谈设计模式之(单件模式)
  • .NET实现之(自动更新)
  • ?
  • @Query中countQuery的介绍
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——