線段樹SegmentTree

線段樹當中的幾個重要操作

1.PushUp

上推操作:由子節點算父節點的信息

p u s h u p push up pushup 操作的目的是為了維護父子節點之間的邏輯關系。當我們遞歸建樹時,對于每一個節點我們都需要遍歷一遍,并且電腦中的遞歸實際意義是先向底層遞歸,然后從底層向上回溯,所以開始遞歸之后必然是先去整合子節點的信息,再向它們的祖先回溯整合之后的信息。
我們在這兒就能看出來,實際上push_up是在合并兩個子節點的信息,所以需要信息滿足結合律!



2.PushDown

下沉操作,又稱為懶標記延遲標記:由父節點計算子節點的信息

之所以稱為懶標記,是因為當我們在修改一個區間的信息的時候,我們不會把這個區間和它的所有子區間全都修改,而是在根節點的區間上標記一下(這就需要一個額外的信息 a d d add add 來儲存我們的修改信息),在用到該區間的時候才進行修改。即延遲修改。

例如我們要修改區間 [ 1 , 10 ] [1, 10] [1,10],我們無須把它的子區間 [ 1 , 5 ] [1, 5] [1,5] [ 6 , 10 ] [6, 10] [6,10] 以及 [ 1 , 5 ] [1, 5] [1,5] [ 6 , 10 ] [6, 10] [6,10] 的子區間全部遞歸修改一番直到修改到葉子節點然后逐層回溯,這樣操作的時間復雜度是可以高達 O ( N l o g N ) O(NlogN) O(NlogN) 的。
我們可以直接在區間 [ 1 , 10 ] [1, 10] [1,10] 標記一下,表示我們修改了這個區間了,但是我們不對他的子區間進行操作,直到某一次查詢或者修改需要使用這個區間的時候,我們才修改這個區間并把它的修改下沉到子區間。

不過我的習慣是,當我們需要標記一個區間的時候,直接就把此區間修改了。

總而言之,懶標記的作用是記錄每次、每個節點要更新的值,也就是delta,但線段樹的優點不在于全記錄(全記錄依然很慢qwq),而在于傳遞式記錄:

整個區間都被操作,記錄在公共祖先節點上;只修改了一部分,那么就記錄在這部分的公共祖先上;



3.Build

將一段區間初始化為線段樹



4.Modify

  1. 單點( P u s h U p PushUp PushUp
  2. 區間( P u s h D o w n PushDown PushDown + P u s h u p Pushup Pushup



5.Query

時間復雜度: O ( 4 × l o g N ) O(4 \times logN) O(4×logN)
查詢某一段區間的信息



6.與樹狀數組的比較

線段樹的常數比樹狀數組
線段樹的 l o g n logn logn 4 4 4 倍的 l o g n logn logn
樹狀數組的 l o g n logn logn 1 1 1 倍的 l o g n logn logn
線段樹點修改和區間查詢的時間復雜度為



7. u p up up d o w n down down操作的使用時機

主要是從定義出發

(1) p u s h u p pushup pushup

p u s h u p pushup pushup 的定義是通過合并子節點的信息并上傳修改根節點的信息,只要修改子節點的信息,就要在回溯的過程中修改父節點的信息。

因此, p u s h u p pushup pushup 一般是在代碼的末尾出現,只有子節點都修改完成之后,才可以吧子節點的信息合并推到父節點上。

例如:

(1)建樹的過程中,如果區間可以繼續劃分,那么我們就要遞歸該根節點的左右區間,當遞歸左右區間結束的時候,就要 p u s h u p pushup pushup 合并返回子節點的信息。
(2)修改區間信息,如果我們修改的區間不能在當前區間直接完成修改,而是要在它的左右區間分別修改一部分,例如區間 [ 1 , 10 ] [1, 10] [1,10],我們要修改 [ 4 , 7 ] [4, 7] [4,7] ,就需要分別修改它的左子樹區間 [ 1 , 5 ] [1, 5] [1,5] 和右子樹區間 [ 6 , 10 ] [6, 10] [6,10]。并在修改結束的時候 p u s h u p pushup pushup 合并子節點的修改信息返回到父節點。

(2) p u s h d o w n pushdown pushdown

p u s h d o w n pushdown pushdown的定義是下沉父節點的修改信息到子節點,只要父節點的信息被修改,就要下沉父節點的修改信息到子節點上。

因此, p u s h d o w n pushdown pushdown 一般在代碼的頭出現,否則此時子節點的信息未被修改,或者說出現修改重疊的情況。

并且,使用 p u s h d o w n pushdown pushdown 的時候一般都是在區間分裂的時候使用的。即,我們不能在當前區間直接完成操作,需要分別在它的左區間或者右區間或者兩個子區間進行操作。而由于我們使用了懶標記,只修改了根區間的信息,它的子區間還未修改,所以說我們要把它的修改信息下沉到子區間并修改和標記子區間。

例如:

(1)執行查詢操作,此時我們得到區間的一些信息,當然要把還未執行的操作執行一下。
(2)執行修改操作,這個不太好理解,雖然說我們的修改操作也可能會使用到兩個子區間的信息,但我們只是對區間加上一個懶標記,為什么還要把根區間的懶標記下沉呢?這是因為我們上面的 pushup 會出現在修改操作里,如果懶標記沒有下傳就會導致子節點的值沒有第一時間更新,父節點就會被錯誤的更新。

再舉個例子解釋一下第(2)點:

  1. 初始化區間 [ 1 , 10 ] [1, 10] [1,10] 所有元素全為 1 1 1,建樹,維護兩個信息: l a z y T a g lazyTag lazyTag 和 區間和 s u m sum sum
  2. 執行修改操作 [ 1 , 10 ] [1, 10] [1,10] 的每個元素都加上 2 2 2,此時區間元素全為3。我們的懶標記修改了區間 [ 1 , 10 ] [1, 10] [1,10] s u m sum sum s u m [ 1 , 10 ] = 30 sum[1, 10] = 30 sum[1,10]=30,但此時區間 [ 1 , 5 ] , [ 6 , 10 ] , . . . , [ 9 , 9 ] , [ 10 , 10 ] [1, 5], [6, 10], ... ,[9, 9],[10, 10] [1,5],[6,10],...,[9,9],[10,10]的值依然是初始狀態下的值。 最后 p u s h u p pushup pushup (由于 [ 1 , 10 ] [1, 10] [1,10] 為整個樹的根節點,所以此時 p u s h u p pushup pushup 啥都沒做)。
  3. 再次執行修改操縱 [ 1 , 5 ] [1, 5] [1,5] 的每個元素都加上 1 1 1(不執行 p u s h d o w n pushdown pushdown),緊接著由于 [ 1 , 5 ] [1, 5] [1,5] 無法包含當前區間 [ 1 , 10 ] [1, 10] [1,10] ,分裂區間為 [ 1 , 5 ] , [ 6 , 10 ] [1, 5], [6, 10] [1,5],[6,10], 遞歸到左區間 [ 1 , 5 ] [1, 5] [1,5],此時正好包含該區間,修改區間 [ 1 , 5 ] [1, 5] [1,5] 的值為 10 10 10,然后 p u s h u p pushup pushup 該區間的修改信息到父區間 [ 1 , 10 ] [1, 10] [1,10], s u m [ 1 , 10 ] = s u m [ 1 , 5 ] + s u m [ 6 , 10 ] = 10 + 5 = 15 sum[1, 10] = sum[1, 5] + sum[6, 10] = 10 + 5 = 15 sum[1,10]=sum[1,5]+sum[6,10]=10+5=15,然后回溯到父區間 [ 1 , 10 ] [1, 10] [1,10],執行 p u s h u p pushup pushup(由于是樹根不執行),結束。
  4. 最后我們發現第二次操作 s u m [ 1 , 10 ] = 15 sum[1, 10] = 15 sum[1,10]=15,甚至比第一次操作的 s u m sum sum 更小了,究其原因在于第一次操作給區間 [ 1 , 10 ] [1, 10] [1,10] 打上的懶標記沒有在第二次操作下沉到子區間,導致子區間實際上沒有執行第一次修改操作。
  5. 如果我們在分裂區間之前執行 p u s h d o w n pushdown pushdown,那么此時有 s u m [ 1 , 5 ] = 15 , s u m [ 6 , 10 ] = 15 sum[1, 5] = 15, sum[6, 10] = 15 sum[1,5]=15,sum[6,10]=15,然后執行第二次修改操作 s u m [ 1 , 5 ] = 15 + 5 = 20 sum[1, 5] = 15 + 5 = 20 sum[1,5]=15+5=20,最后合并區間 [ 1 , 5 ] , [ 6 , 10 ] [1, 5], [6, 10] [1,5],[6,10] 的和上傳到區間 [ 1 , 10 ] [1, 10] [1,10],此時 s u m [ 1 , 10 ] = 20 + 15 = 35 sum[1, 10] = 20 + 15 = 35 sum[1,10]=20+15=35 就正確了



8.常見的SE錯誤來源

  1. 數組空間沒有開四倍
  2. m i d = l + r > > 1 mid = l + r >> 1 mid=l+r>>1 還是 m i d = t r [ u ] . l + t r [ u ] . r > > 1 mid = tr[u].l + tr[u].r >> 1 mid=tr[u].l+tr[u].r>>1
  3. u < < 1 u << 1 u<<1 或者 u < < 1 ∣ 1 u << 1|1 u<<1∣1 是否寫錯
  4. b u i l d build build 里面 e l s e else else 循環中,是否初始化 t r [ u ] = { l , r . . . } tr[u] =\{l, r... \} tr[u]={l,r...}



例題

1.區間加法

模板題

步驟二:思路
步驟三:代碼


2.區間乘法 + 區間加法

步驟一:題目描述

模板題

步驟二:思路
步驟三:代碼


3.區間最大公約數

步驟一:題目描述

結論

步驟二:思路
步驟三:代碼


4.最大連續字段和

步驟一:題目描述

維護額外信息

步驟二:思路
步驟三:代碼


4.區間最值

步驟一:題目描述

思維

步驟二:思路
步驟三:代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73529.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73529.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73529.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SSH免密登錄服務器方法

Window免密連接Linux系統 生成公匙 ssh-keygen -t rsa一路回車生成公鑰 復制公匙&#xff0c;使用記事本打開復制全部內容 notepad C:\Users\DELL\.ssh\id_rsa.pub內容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 遠程登錄服務器將內容寫入~/.ssh/authorized_keys echo …

Go 1.24 新特性解析:泛型類型別名、弱指針與終結器改進

文章精選推薦 1 JetBrains Ai assistant 編程工具讓你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的圖標增強神器 3 IDEA插件推薦-SequenceDiagram&#xff0c;自動生成時序圖 4 BashSupport Pro 這個ides插件主要是用來干嘛的 &#xff1f; 5 IDEA必裝的插件&…

MySQL 表 t1 建立聯合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目錄 聯合索引 abc 均范圍掃描時的索引生效情況無回表 表數據量非常少無回表 表數據量多有回表總結 聯合索引 abc 均范圍掃描時的索引生效情況 場景&#xff1a;表 t1 建立聯合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…

海外營收占比近4成,泡泡瑪特全球化戰略迎收獲期

3月26日&#xff0c;泡泡瑪特國際集團發布2024全年財報。財報顯示&#xff0c;2024年泡泡瑪特實現營收130.4億元&#xff08;人民幣&#xff0c;下同&#xff09;&#xff0c;同比增長106.9%&#xff0c;經調整凈利潤34.0億元&#xff0c;同比增長185.9%。中國內地營收79.7億元…

ctf-web: 不統一的解析 + sql注入要求輸入與輸出相等 -- tpctf supersqli

# 從 django.shortcuts 模塊導入 render 函數&#xff0c;用于渲染模板 from django.shortcuts import render # 從 django.db 模塊導入 connection 對象&#xff0c;用于數據庫連接 from django.db import connection# 此模塊用于創建視圖函數 # 從 django.http 模塊導入 Http…

LLM推理加速框架有哪些

LLM推理加速框架有哪些 目錄 LLM推理加速框架有哪些1. TensorRT簡介簡單使用示例2. Triton Inference Server簡介簡單使用示例3. SGLang簡介簡單使用示例4. vLLM簡介簡單使用示例1. TensorRT 簡介 TensorRT 是 NVIDIA 推出的一個用于高性能深度學習推理的 SDK。它能夠對訓練好…

【深度學習與實戰】2.1、線性回歸模型與梯度下降法先導案例--最小二乘法(向量形式求解)

為了求解損失函數 對 的導數&#xff0c;并利用最小二乘法向量形式求解 的值&#xff0c;我們按照以下步驟進行&#xff1a; ?1. 損失函數的含義? 這是?線性回歸?的平方誤差損失函數&#xff0c;目標是最小化預測值 與真實值 之間的差距。 ?定義損失函數?&#xf…

S7-1200對V90 PN進行位置控制的三種方法

S7-1200系列PLC通過PROFINET與V90 PN伺服驅動器搭配進行位置控制,實現的方法主要有以下三種: ? 方法一、在PLC中組態位置軸工藝對象,V90使用標準報文3,通過MC_Power、MC_MoveAbsolute等PLC Open標準程序塊進行控制, 這種控制方式屬于中央控制方式(位置控制在PLC中計算,驅…

愛普生FC-135晶振5G手機的極端溫度性能守護者

在5G時代&#xff0c;智能手機不僅需要高速率與低延遲&#xff0c;更需在嚴寒、酷暑、振動等復雜環境中保持穩定運行。作為 5G 手機的核心時鐘源&#xff0c;愛普生32.768kHz晶振FC-135憑借其寬溫適應性、高精度穩定性與微型化設計&#xff0c;成為5G手機核心時鐘源的理想選擇&…

ROS--IMU數據包

IMU慣性測量單元 一&#xff1a;IMU二&#xff1a;ROS中三&#xff1a;IMU數據包三&#xff1a;總結 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一&#xff1a;IMU IMU&#xff08;Inertial Measurement Unit&#xff0c;慣性測量單元&#xff09…

數據文件誤刪除,OceanBase中如何重建受影響的節點

當不慎誤刪數據文件且當前沒有現成的可替換節點時&#xff0c;在OceanBase中&#xff0c;不必急于采取極端措施&#xff0c;可以考慮運用 server_permanent_offline_time 參數&#xff0c;來重建受影響的節點。 原理&#xff1a; server_permanent_offline_time 是 OceanBase數…

Python:匹配多個字符,如何匹配開頭

匹配字符0次或無數次(*)&#xff1a; import re resre.match([A-Z][a-z]*,Lihailu) print(res.group())#提取數據 輸出結果可以全部輸出 匹配字符至少一次()&#xff1a; import re resre.match([A-Za-z]python,apython) print(res.group())#提取數據(后邊只寫python會…

Unity-RectTransform設置UI width

不知道有沒人需要這樣的代碼&#xff0c;就是.sizeDelta //不確定是不是英文翻譯的原因&#xff0c;基本很難理解&#xff0c;sizeDeltaSize&#xff0c;//未必完全正確&#xff0c;但這么寫好像總沒錯過 //image 在一個UnityEngine.UI.Image 的數組內foreach (var image in l…

java學習——函數式編程(1)

函數式編程 Java 的函數式編程是一種以函數為核心構建邏輯的編程范式,強調不可變性、聲明式代碼和無副作用的操作。它通過Lambda表達式、函數式接口(如Function、Predicate、Consumer等)和Stream API等特性實現,將計算過程抽象為函數的組合與轉換,而非傳統的命令式步驟。…

AP CSA FRQ Q2 Past Paper 五年真題匯總 2023-2019

Author(wechat): bigshuang2020 ap csa tutor, providing 1-on-1 tutoring. 國際教育計算機老師, 擅長答疑講解&#xff0c;帶學生實踐學習。 熱愛創作&#xff0c;作品&#xff1a;ap csa原創雙語教案&#xff0c;真題梳理匯總&#xff0c; AP CSA FRQ專題沖刺, AP CSA MCQ小題…

線程池詳解:在SpringBoot中的最佳實踐

線程池詳解&#xff1a;在SpringBoot中的最佳實踐 引言 在Java并發編程中&#xff0c;線程池是一種非常重要的資源管理工具&#xff0c;它允許我們在應用程序中有效地管理和重用線程&#xff0c;從而提高性能并降低資源消耗。特別是在SpringBoot等企業級應用中&#xff0c;正…

2025年IT行業技術革命全景解析:從AI到量子計算的落地實踐

簡介 2025年&#xff0c;全球IT行業正經歷一場由AI、量子計算、物聯網等技術驅動的變革。從BOE的AI制造系統到德易科技的無人機光伏巡檢&#xff0c;從鯤鵬處理器的國產化突破到量子計算的算力革命&#xff0c;技術創新正在重塑產業格局。本文結合最新行業動態與實戰案例&…

JVM - 年輕代和老年代

通過一些問題來討論 JVM 中年輕代和老年代的內容 為什么要區分年輕代和老年代&#xff1f;哪些對像會進入老年代&#xff1f;什么時候會進行年輕代GC&#xff1f;什么時候會進行老年代GC&#xff1f; 1. 為什么要區分年輕代和老年代&#xff1f; 年輕代中的對象大部分都是短期…

【react】在react中async/await一般用來實現什么功能

目錄 基本概念 工作原理 優點 注意事項 底層原理 實際應用場景 1. 數據獲取 (API 請求) 2. 表單提交 3. 異步狀態管理 4. 異步路由切換 5. 異步數據預加載 6. 第三方 API 調用 7. 文件上傳/下載 8. 路由導航攔截 關鍵注意事項 基本概念 async 函數&#xff1a;用…

高維小樣本數據的在線流特征選擇

發布于24年國際學習和控制論雜志 文獻地址 簡要總結 《Online streaming feature selection for high-dimensional small-sample data》研究了高維小樣本數據&#xff08;HDSS&#xff09;在類別不平衡情況下的在線流式特征選擇問題&#xff0c;提出了一種名為OSFSHS的算法。…