洛谷 P3374 [模板] 树状数组 1

C++数据结构【树状数组】 树状数组是类似线段树的一个数据结构,支持单点修改、查询,区间修改、查询等操作,当你用查分TLE时,你就可以用树状数组解决。lowbit是树状数组中计算一个节点指向另外哪一个节点的函数。就如图1号节点指向的是2号节点是因为1的lowbit值为2,而6号节点指向8号节点是因为6的lowbit值为8. 阅读详情

【模板】树状数组 1

题目描述

如题,已知一个数列,你需要进行下面两种操作:

  • 将某一个数加上 xxx

  • 求出某区间每一个数的和

输入格式

第一行包含两个正整数 n,mn,mn,m,分别表示该数列数字的个数和操作的总个数。

第二行包含 nnn 个用空格分隔的整数,其中第 iii 个数字表示数列第 iii 项的初始值。

接下来 mmm 行每行包含 333 个整数,表示一个操作,具体如下:

  • 1 x k 含义:将第 xxx 个数加上 kkk

  • 2 x y 含义:输出区间 [x,y][x,y][x,y] 内每个数的和

输出格式

输出包含若干行整数,即为所有操作 222 的结果。

样例 #1

样例输入 #1

5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4

样例输出 #1

14
16

提示

【数据范围】

对于 30%30\%30% 的数据,1≤n≤81 \le n \le 81≤n≤8,1≤m≤101\le m \le 101≤m≤10;
对于 70%70\%70% 的数据,1≤n,m≤1041\le n,m \le 10^41≤n,m≤104;
对于 100%100\%100% 的数据,1≤n,m≤5×1051\le n,m \le 5\times 10^51≤n,m≤5×105。

数据保证对于任意时刻,aaa 的任意子区间(包括长度为 111 和 nnn 的子区间)和均在 [−231,231)[-2^{31}, 2^{31})[−231,231) 范围内。

思路

树状数组模板题当然要用树状数组写啦。 首先,lowbitlowbitlowbit 为一个数的二进制表示中最右边的 111 所对应的 222 次幂的值。而树状数组其实是利用二进制表示的特性,用每一个节点来存储某一段区间的信息。虽然树状数组的节点不包含所有的区间,但是它可以对已存储的区间对应节点进行O(logN)O(logN)O(logN)次的加加减减的操作,使之可以任意表示一个区间。也就是说,树状数组可以将数量庞大的所有区间用数量较小的节点区间以每次O(logN)O(logN)O(logN)的复杂度来全部表示。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn = 5e5 + 6;

int n, m;

int s[maxn]; // 树状数组

int lowbit(int x) // 获取低位2次幂数
{
    return x & -x;
}

void change(int x, int k) // 单点修改
{
    while (x <= n)
    {
        s[x] += k;
        x += lowbit(x);
    }
}

int query(int x) // 前缀和查询
{
    int res = 0;
    while (x)
    {
        res += s[x];
        x -= lowbit(x);
    }
    return res;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m;

    int x, y, k, op;

    for (int i = 1; i <= n; i++)
    {
        cin >> k;
        change(i, k);
    }

    while (m--)
    {
        cin >> op;
        if (op == 1)
        {
            cin >> x >> k;
            change(x, k);
        }
        else
        {
            cin >> x >> y;
            cout << query(y) - query(x - 1) << '\n'; // 区间答案即为[0,y]的前缀和减去[0,x-1]的前缀和
        }
    }

    return 0;
}
树状数组c++详解 树状数组(Binary Indexed Tree,简称BIT)是一种用于高效处理数组范围查询和单点更新操作的数据结构。它解决了传统的线段树在处理范围查询时的低效问题,并且在某些情况下,比如查询和更新操作频繁的情况下,它比线段树更快。请注意,树状数组的索引是从1开始的,所以我们在所有操作中都对索引进行了加1的处理。此外,树状数组的大小通常是原始数组的大小加上1,以确保我们可以安全地使用索引来访问所有的节点。表示为一个二进制数,然后用这个二进制数的最后一个1来确定它是哪个父节点的子节点。调用来计算出区间和。 阅读详情

相关推荐

C++树状数组 (原理 + 代码 + lowbit解释)

树状数组作为一种高效的数据结构,可以在O(logn)内完成更新和查询操作,因此非常适合加减, 区间和, 查询。给定一个n个元素的数组A1,A2,…,An,你的任务是设计一个数据结构,支持以下两种操作。

2301_79532071的博客 685

c++树状数组——超实用的数据结构

树状数组(Fenwick Tree)是一种高效的数据结构,用于解决一类常见的问题,特别是在数组中进行动态单点更新和前缀区间查询的情况。它是一种基于二进制表示的数据结构,通常用于处理频繁的数值累加和检索操作。树状数组支持以下两个主要操作:▶ 单点信息修改。O(logN) 修改序列 a 中某个元素的值。▶ 前缀信息查询。O(logN) 查询进行前缀信息。今天的文章就到这里啦,三连必回qwq!

yzc_qiuse的博客 1692

洛谷P3374 【模板】树状数组 1

核心思路:用树状数组的分层辅助数组 c[] 替代原数组,通过lowbit实现高效的单点更新(O(logn))和前缀和查询(O(logn)),区间查询则转化为两个前缀和的差。关键细节树状数组下标必须从 1 开始(避免导致死循环);单点更新是累加增量),而非直接赋值;区间查询的本质是前缀和的差,这是所有区间和问题的通用技巧。适用场景:只要问题是 “单点更新 + 区间查询”(或 “区间更新 + 单点查询”,树状数组也可适配),且数据量较大,优先选择树状数组(比线段树代码更简洁、常数更小)。

Liuchang0911的博客 697

【C++】树状数组

什么是树状数组? 顾名思义,就是用数组来模拟树形结构呗。那么衍生出一个问题,为什么不直接建树?答案是没必要,因为树状数组能处理的问题就没必要建树。和Trie树的构造方式有类似之处。 树状数组可以解决什么问题? 可以解决大部分基于区间上的更新以及求和问题。 树状数组和线段树的区别在哪里? 树状数组可以解决的问题都可以用线段树解决,这两者的区别在哪里呢?树状数组的系数要少很多,就比如字符串模拟大数可以...

Ljnoit 1276

西门子PLC与汇川SV660P伺服速度模式配置实战指南

本文详细介绍了西门子S7-1200 PLC与汇川SV660P伺服驱动器在速度模式下的配置实战指南。从硬件接线、伺服参数配置到TIA Portal软件组态和PLC程序编写,提供了全面的操作步骤和实用技巧,帮助工程师快速解决伺服系统调试中的常见问题,确保系统稳定运行。

weixin_30316097的博客 500

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计提示:本文采用PHP对数据库进行操作:本文就介绍了PHP实现对MySQL数据库的增删改查操作基础内容。

900

洛谷 P3374 【模板】树状数组 1(树状数组解法)

树状数组是一种高效的数据结构,用于维护序列的区间和,支持单点修改和区间查询操作,时间复杂度均为$O(\log n)$。其核心思想是通过lowbit函数确定每个节点的管辖范围,并通过递推关系快速更新和查询。在实现中,update函数用于单点修改,通过逐级更新父节点来维护区间和;sum函数用于查询前$i$项的和,通过逐级累加子节点的值得到结果。区间查询则通过两次sum调用相减实现。树状数组适用于需要频繁进行单点修改和区间查询的场景,如动态维护序列的区间和。

君义NOIP的博客 1459

从零到一:QT for OpenHarmony 开发环境实战搭建与踩坑指南

本文是一份详尽的QT for OpenHarmony开发环境搭建实战指南。文章手把手教你如何在Windows和macOS系统上,从环境准备、核心工具(DevEco Studio与社区版QT SDK)安装配置,到创建首个QT Quick项目、解决构建部署中的常见问题,最终实现应用在OpenHarmony设备上运行。内容涵盖关键配置修改、资源管理及深度踩坑经验,旨在帮助开发者高效开启跨平台开发之旅。

weixin_29190573的博客 325

洛谷——P3374 【模板】树状数组 1

数据保证对于任意时刻,a 的任意子区间(包括长度为 1 和 n 的子区间)和均在 [−231,231) 范围内。第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。第一行包含两个正整数 n,m,分别表示该数列数字的个数和操作的总个数。对于 30% 的数据,1≤n≤8,1≤m≤10;对于 100% 的数据,1≤n,m≤5×105。输出包含若干行整数,即为所有操作 2 的结果。含义:输出区间 [x,y] 内每个数的和。对于 70% 的数据,1≤n,m≤104;

2401_87150369的博客 392

人工智能训练师技能等级认定四级技能考核试卷-样题4

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总时长150分钟。考核内容涵盖:1)车牌数据集规范评估与格式处理;2)车牌数据集采集代码修改与数据处理;3)房价预测数据集加载、预处理与可视化分析;4)车牌标注数据集审核与修正;5)螺丝螺母检测数据集的平台创建与共享;6)螺丝螺母数据的去噪处理与标注优化。要求考生使用Python编程、数据处理平台和标注工具完成各项任务,重点考察数据加载、格式转换、缺失值处理、数据可视化、标注审核及平台操作等技能。所有操作需在配备Python3.7和深度学习平台的W

weixin_42221934的博客 348

ubuntu17.04 UHD 驱动出错

ubuntu 17.04 源码安装UHD

xrh003的博客 1万+

洛谷 P3374 【模板】树状数组 1(线段树解法)

本文介绍了线段树的基本概念、性质及其在解决单点修改和区间查询问题中的应用。线段树是一种基于分治思想的平衡二叉树结构,能够高效处理区间信息。文章详细阐述了线段树的构建、单点修改(时间复杂度O(logn))和区间查询(时间复杂度O(logn))的实现原理,并给出了对应的C++代码实现。通过洛谷P3374题目的具体应用,展示了如何利用线段树解决实际问题。

君义NOIP的博客 1198

Altium Designer(AD)仿真实验操作指南

1:运行仿真2:设置仿真3:放置电源模块4:放置器件模块5:探针。

XU157303764的博客 8897

洛谷 P3374 【模板】树状数组 1

洛谷 P3374 【模板】树状数组 1 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3个整数,表示一个操作,具体如下: 操作1: 格式:1 x k ...

anhaoti3785的博客 464

当启动容器的时候提示:exec format error?如何解决问题

Docker容器出现"exec format error"的主要原因是架构不兼容(如ARM设备运行x86镜像)。解决方案包括:1)匹配镜像与宿主机架构;2)构建时指定平台;3)安装QEMU模拟器;4)修复文件权限和格式;5)验证基础镜像兼容性。排查流程应从检查架构匹配开始,逐步验证权限、解释器和换行符等问题。建议优先使用多架构镜像,构建时明确指定平台,并使用buildx工具生成多平台镜像。调试时可进入容器手动验证文件格式和兼容性。

weixin_39291964的博客 2718

图神经网络实战(7)——图卷积网络(Graph Convolutional Network, GCN)详解与实现

图卷积网络 (Graph Convolutional Network, GCN) 架构由 Kipf 和 Welling 于 2017 年提出,其理念是创建一种适用于图的高效卷积神经网络。在本节中,我们将讨论 Vanilla GNN 架构的局限性,并详细介绍 GCN 的工作原理,通过使用 PyTorch Geometric 在 Cora 和 Facebook Page-Page 数据集上实现 GCN 来验证其性能。

盼小辉丶的博客 2万+

【洛谷】P3374 【模板】树状数组 1

题目地址: https://www.luogu.com.cn/problem/P3374 树状数组模板题。树状数组也叫Fenwick Tree或者Binary Indexed Tree,建树时间O(nlog⁡n)O(n\log n)O(nlogn),支持O(log⁡n)O(\log n)O(logn)查询数组前缀和(于是就支持O(log⁡n)O(\log n)O(logn)的范围求和),也支持O(...

数学、算法爱好者的博客 769

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

洛谷 - P3374[模板]树状数组1

题目链接:https://www.luogu.org/problemnew/show/P3374 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3个整数,表示一个...

ityanger的技术栈 2671

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

洛谷 P3374:【模板】树状数组 1

在算法竞赛中,树状数组已成为解决逆序对、区间统计等问题的标准工具‌。树状数组通过二进制索引将线性结构转化为隐式树形结构,平衡了空间与时间效率。

hnjzsyjyj的专栏 739
上一篇: 洛谷 P4178 Tree 题解 点分治
下一篇: 洛谷 P3368 【模板】树状数组 2
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值