樹狀數組 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
英文地址,請注明出處:http://en.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;交通流量預測是智能交通系統中的…