洛谷 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

OpenClaw本地部署教程

本文详细介绍了在Windows 11系统上部署OpenClaw与Ollama本地模型的完整流程。主要内容包括:硬件要求说明、Node.js环境配置、Ollama模型安装与定制(重点扩展上下文窗口至32768 tokens)、OpenClaw核心框架安装与对接、常见问题解决(如模型上下文窗口过小报错)以及可选技能扩展和飞书接入方案。部署全程约需1-2小时,强调使用备用设备或虚拟机以确保安全,并提供关键配置参数和排错命令。该方案实现了"数据不出门、推理本地化"的私有化部署目标。

技术引领业务创新 2577

神州数码OSPF实战配置详解(手把手教学)

本文提供神州数码设备上OSPF基础配置的详细实战教程。通过搭建典型的两台三层交换机互联实验环境,手把手演示了VLAN创建、接口IP配置、OSPF进程启动、Router-ID设置及网络宣告等核心步骤,并分享了邻居状态验证、路由检查及常见排错方法,帮助网络工程师快速掌握神州数码OSPF的配置要点与操作技巧。

weixin_29210727的博客 79

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

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

君义NOIP的博客 1459

Zabbix在Ubuntu 22.04上的性能优化与监控实战:从基础安装到高级配置

本文详细介绍了在Ubuntu 22.04系统上部署和优化Zabbix监控系统的完整流程,从基础安装到高级配置。内容包括MySQL数据库设置、Zabbix服务器与Web前端优化、性能调优策略以及实战监控场景应用,帮助用户构建高效的企业级监控解决方案。

sss66的博客 895

洛谷——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

GeoXCP:可解释人工智能中空间解释的不确定性量化

GeoXCP: uncertainty quantification of spatial explanations in explainable AI提出基于保形预测(conformal prediction)的不确定性量化框架——地理空间解释保形预测(GeoXCP),将空间依赖纳入建模过程,生成具有校准不确定性估计的空间自适应解释。通过大量模拟实验和真实世界数据集验证,GeoXCP在不同地理空间场景中能提供可靠解释并有效量化不确定性,推动可解释地理空间机器学习的发展,帮助决策者评估模型驱动洞察的可信度。

May the Force be with you 243

【ODX介绍】-5-用于Flash刷写的ODX-F文件概述

用于Flash刷写的ODX-F文件概述

「汽车电子助手」的博客 2531

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

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

君义NOIP的博客 1198

【踩坑记录】colmap中的相机位姿的坐标系定义及其可视化结果的隐含转换

1 坐标系定义及转换   首先介绍一下世界坐标系和相机坐标系之间的转换,它们之间是存在一个转换关系的。现假设空间中一点X,它在相机坐标系下的坐标是Xcamera,在世界坐标系下的坐标是Xworld。假设它通过R和t实现从相机坐标系到世界坐标系之间的转换: Xworld = RXcamera + t   那么,由上式,我们可以推得从世界坐标系向相机坐标系的转换关系(RT=R-1,所以通常直接使用RT即可): Xcamera = RTXworld - RTt   所以,两个坐标系之间的转换,需要看其具体

zeeq的博客 2万+

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

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

anhaoti3785的博客 464

2026保姆级:1小时搞定C# OPC UA客户端开发——PLC与上位机全量数据交互零基础教程

本文介绍了使用C#开发OPC UA客户端的核心流程和关键代码实现。文章首先指出工业上位机开发中OPC UA的重要性,并针对新手常见问题提出了1小时掌握核心功能的解决方案。重点内容包括:选择官方.NET Standard库的优势、5分钟搭建开发环境的步骤、OPC UA客户端架构与通信流程的图解说明,以及完整的客户端基础类代码实现,涵盖了连接管理、证书配置、安全认证等关键功能。通过本文提供的代码模板,开发者可快速实现与PLC等工业设备的稳定数据交互。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 799

Python爬虫实战:利用最新技术高效爬取百度贴吧帖子内容

本文将详细介绍如何使用Python最新技术栈构建一个高效的百度贴吧爬虫,包括requests-html异步请求、BeautifulSoup4解析、数据存储到MongoDB以及应对反爬机制等完整解决方案。文章包含5000余字详细教程和完整代码实现。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和内容聚合等领域。Python凭借其丰富的库生态系统成为爬虫开发的首选语言。贴吧作为中文互联网最大的兴趣社区,包含大量有价值的UGC内容。动态加载内容处理登录状态维持。

2201_76125261的博客 540

【洛谷】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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

ityanger的技术栈 2671

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

hnjzsyjyj的专栏 739

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 洛谷 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、付费专栏及课程。

余额充值