树状数组 2

L - 树状数组 2

 洛谷 - P3368 

Description

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

  1. 将某区间每一个数加上 x;

  2. 求出某一个数的值。

Input

第一行包含两个整数 N、M,分别表示该数列数字的个数和操作的总个数。

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

接下来 M 行每行包含 2 或 4个整数,表示一个操作,具体如下:

操作 1: 格式:1 x y k 含义:将区间 [x,y]内每个数加上 k;

操作 2: 格式:2 x 含义:输出第 x 个数的值。

Output

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

Sample 1

InputcopyOutputcopy
5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
6
10

Hint

样例 1 解释:

故输出结果为 6、10。


数据规模与约定

对于 30%的数据:N≤8,M≤10;

对于 70%的数据:N≤10000,M≤10000;

对于 100% 的数据:1≤N,M≤500000,1≤x,y≤n,保证任意时刻序列中任意元素的绝对值都不大于 230。

思路:

问题分析

需要处理两种操作:

  1. 区间增量操作:给区间[x, y]内的每个元素加上k
  2. 单点查询操作:查询第x个元素的值。

直接使用暴力方法(遍历区间进行增量)的时间复杂度为O(N),对于大规模数据(如N=500000)会导致超时。因此需要使用更高效的数据结构或算法。

差分数组与树状数组优化

差分数组可以有效处理区间增量操作,树状数组(Fenwick Tree)可以高效实现差分数组的前缀和查询。

差分数组原理

  • 原数组A的差分数组D定义为D[1] = A[1]D[i] = A[i] - A[i-1]i > 1)。
  • 区间增量操作[x, y]加上k,只需执行D[x] += kD[y+1] -= k
  • 查询A[x]的值即为差分数组D的前缀和sum(D[1..x])

树状数组优化

  • 树状数组支持高效的单点更新和前缀查询(O(logN)时间复杂度)。
  • 用树状数组维护差分数组D,可以快速处理区间增量和单点查询。

代码实现思路

  1. 初始化差分数组

    • 读取初始数组并构建差分数组DD[i] = A[i] - A[i-1]i > 1),D[1] = A[1]
    • 使用树状数组维护D的数值。
  2. 处理操作

    • 区间增量操作1 x y k:调用add(x, k)add(y+1, -k)
    • 单点查询操作2 x:调用count(x)获取前缀和,即A[x]的值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n, m;
int a[500005];
int lowbit(int x) {return x & (-x);
}
void add(int i, int w) {while (i <= n) {a[i] += w;i += lowbit(i);}
}
可以不写add中-w就OK了
//void sub(int i, int w) {
//    while (i <= n) {
//        a[i] -= w;
//        i += lowbit(i);
//    }
//}
int count(int i) {int result = 0;while (i > 0) {result += a[i];i -= lowbit(i);}return result;
}
int main() {ios::sync_with_stdio(false);        // 禁用同步cin.tie(nullptr);                   // 解除cin与cout绑定cin >> n >> m;int w;int u;for (int i = 1; i <= n; i++) {cin >> w;if (i == 1) {u = w;add(i, u);}elseadd(i, w-u);u = w;}int h, x,y, k;for (int i = 1; i <= m; i++) {cin >> h;if (h == 1) {cin >> x >> y >> k;add(x, k);add(y + 1, -k);}else {cin >> x;cout << count(x) << endl;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85069.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv2 技术详解:目标检测的又一次飞跃

&#x1f9e0; YOLOv2 技术详解&#xff1a;目标检测的又一次飞跃 一、前言 在 YOLOv1 提出后&#xff0c;虽然实现了“实时性 单阶段”的突破&#xff0c;但其在精度和小物体检测方面仍有明显不足。为了弥补这些缺陷&#xff0c;Joseph Redmon 等人在 2017 年提出了 YOLOv2…

JAFAR Jack up Any Feature at Any Resolution

GitHub PaPer JAFAR: Jack up Any Feature at Any Resolution 摘要 基础视觉编码器已成为各种密集视觉任务的核心组件。然而&#xff0c;它们的低分辨率空间特征输出需要特征上采样以产生下游任务所需的高分辨率模式。在这项工作中&#xff0c;我们介绍了 JAFAR——一种轻量级…

SamWaf 开源轻量级网站防火墙源码(源码下载)

SamWaf网站防火墙是一款适用于小公司、工作室和个人网站的开源轻量级网站防火墙&#xff0c;完全私有化部署&#xff0c;数据加密且仅保存本地&#xff0c;一键启动&#xff0c;支持Linux&#xff0c;Windows 64位,Arm64。 主要功能&#xff1a; 代码完全开源 支持私有化部署…

79Qt窗口_QDockWidget的基本使用

目录 4.1 浮动窗⼝的创建 4.2 设置停靠的位置 浮动窗⼝ 在 Qt 中&#xff0c;浮动窗⼝也称之为铆接部件。浮动窗⼝是通过 QDockWidget类 来实现浮动的功能。浮动窗 ⼝⼀般是位于核⼼部件的周围&#xff0c;可以有多个。 4.1 浮动窗⼝的创建 浮动窗⼝的创建是通过 QDockWidget…

UE/Unity/Webgl云渲染推流网址,如何与外部网页嵌套和交互?

需求分析&#xff1a;用threejs开发的数字孪生模型&#xff0c; 但是通过webgl技术网页中使用&#xff0c;因为模型数据量大&#xff0c;加载比较慢&#xff0c;且需要和其他的业务系统进行网页嵌套和交互&#xff0c;使用云渲染技术形成的推流网址&#xff0c;如何与外部网页嵌…

在Termux中搭建完整Python环境(Ubuntu+Miniconda)

蹲坑也能写python? 📱 环境准备🛠 详细搭建步骤步骤1:安装Linux容器工具步骤2:查看可用Linux发行版步骤3:安装Ubuntu系统步骤4:登录Ubuntu环境步骤5:下载Miniconda安装包步骤6:安装Miniconda⚡ 环境验证💡 使用技巧⚠️ 注意事项前言:想在吃饭、通勤甚至休息间隙…

EventSourcing.NetCore:基于事件溯源模式的 .NET Core 库

在现代软件架构中&#xff0c;事件溯源&#xff08;Event Sourcing&#xff09;已经成为一种非常流行的模式&#xff0c;尤其适用于需要高可用性和数据一致性的场景。EventSourcing.NetCore 是一个基于事件溯源模式的 .NET Core 库&#xff0c;旨在帮助开发者更加高效地实现这一…

Linux下的第一个程序——进度条(命令行版本)

文章目录 编写Linux下的第一个小程序——进度条进度条的样式前置知识回车和换行缓冲区对回车、换行、缓冲区、输出的测试代码简单的测试样例倒计时程序 进度条程序理论版本基本框架代码实现 真实版本基础框架 代码实现 编写Linux下的第一个小程序——进度条 在前面的基础开发工…

【项目】仿muduo库one thread one loop式并发服务器前置知识准备

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 |&#x1f5c3;️ mysql 本文介绍了一种基于muduo库实现的主从Reactor模型高并发服务器框架…

steam报网络错误,但电脑是网络连接的

steam报网络错误&#xff0c;但电脑是网络连接的 如&#xff1a; 解决办法&#xff1a; 关闭电脑防火墙和所有杀毒软件&#xff0c;然后重新打开steam开代理&#xff0c;可能国内有时候访问不了 首选1进行尝试 steam安装路径一定要在纯英文路径下 已ok

Vue 组合式 API 与 选项式 API 全面对比教程

一、前言&#xff1a;Vue 的两种 API 风格 Vue 提供了两种编写组件逻辑的方式&#xff1a;组合式 API (Composition API) 和 选项式 API (Options API)。理解这两种方式的区别和适用场景&#xff0c;对于 Vue 开发者至关重要。 为什么会有两种 API&#xff1f; 选项式 API&a…

HarmonyOS 应用模块化设计 - 面试核心知识点

HarmonyOS 应用模块化设计 - 面试核心知识点 在 HarmonyOS 开发面试中&#xff0c;模块化设计是必考知识点。本文从面试官角度深度解析 HarmonyOS 应用模块化设计&#xff0c;涵盖 HAP、HAR、HSP 等核心概念&#xff0c;助你轻松应对技术面试&#xff01; &#x1f3af; 面试高…

Maven高级学习笔记

分模块设计 为什么分模块设计?将项目按照功能拆分成若干个子模块&#xff0c;方便项目的管理维护、扩展&#xff0c;也方便模块间的相互调用&#xff0c;资源共享。 注意事项&#xff1a;分模块开发需要先针对模块功能进行设计&#xff0c;再进行编码。不会先将工程开发完毕&…

[创业之路-423]:经济学 - 大国竞争格局下的多维博弈与科技核心地位

在当今风云变幻的国际舞台上&#xff0c;大国竞争已成为时代的主旋律&#xff0c;其激烈程度与复杂性远超以往。这场全方位的较量&#xff0c;涵盖了制度、思想、文化、经济、科技、军事等诸多关键领域&#xff0c;每一个维度都深刻影响着大国的兴衰成败&#xff0c;而科技在其…

【企业容灾灾备系统规划】

一、企业灾备体系 1.1 灾备体系 灾备切换的困境: 容灾领域的标准化方法和流程、算法体系是确保业务连续性和数据可靠性的核心,以下从标准框架、流程规范、算法体系三个维度进行系统分析: 1.1.1、标准化方法体系​ ​1. 容灾等级标准​ ​国际标准SHARE78​: 将容灾能力划…

Kafka Connect基础入门与核心概念

一、Kafka Connect是什么&#xff1f; Apache Kafka Connect是Kafka生态中用于构建可扩展、可靠的数据集成管道的组件&#xff0c;它允许用户将数据从外部系统&#xff08;如数据库、文件系统、API等&#xff09;导入Kafka&#xff08;Source Connector&#xff09;&#xff0…

从零手写Java版本的LSM Tree (四):SSTable 磁盘存储

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…

Kotlin的5个主要作用域函数

applay, also,let, run, with 是kotlin标准库提供的5个主要的作用域函数&#xff08;Scope Functions&#xff09;​&#xff0c;它们的设计目的是为了在特定作用域内更简洁地操作对象。 如何使用这5个函数&#xff0c;要从它的设计目的来区分&#xff1a; apply : 配置/对象…

原型模式Prototype Pattern

模式定义 用原型实例指定创建对象的种类&#xff0c;并且通过复制这些原型创建新的对象&#xff0c;其允许一个对象再创建 另外一个可定制的对象&#xff0c;无须知道任何创建的细节 对象创建型模式 基本工作原理是通过将一个原型对象传给那个要发动创建的对象&#xff0c;这…

基于深度学习的智能交通流量预测系统:技术与实践

前言 随着城市化进程的加速&#xff0c;交通拥堵问题日益严重&#xff0c;给人们的日常生活和经济发展带来了巨大的挑战。智能交通系统&#xff08;ITS&#xff09;作为解决交通问题的重要手段&#xff0c;逐渐成为研究的热点。其中&#xff0c;交通流量预测是智能交通系统中的…