日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线段树学习笔记

發布時間:2024/10/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线段树学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • source:[線段樹 從入門到進階](https://www.cnblogs.com/jason2003/p/9676729.html)(看個思路)
    • code:線段樹(單點修改+區間查詢)(區間修改+區間查詢)(這個代碼能用)
    • 原理:
    • 單點修改 區間查詢
    • ~~區間修改 單點查詢~~
    • 區間修改 區間查詢
      • 懶惰標記:
    • 乘法/根號線段樹

source:線段樹 從入門到進階(看個思路)

code:線段樹(單點修改+區間查詢)(區間修改+區間查詢)(這個代碼能用)

1.二叉搜索樹
對于一個線段,我們會用一個二叉樹來表示
2.一顆二叉樹,她的左兒子和右兒子編號分別是她2和她2+1
eg:tree[i].sum=tree[i2].sum+tree[i2+1].sum;就可以建一顆線段樹了!
3.

inline void build(int i,int l,int r){//遞歸建樹 ///i是編號 l是左 r是右tree[i].l=l;tree[i].r=r;if(l==r){//如果這個節點是葉子節點tree[i].sum=input[l];return ;}int mid=(l+r)>>1;build(i*2,l,mid);//分別構造左子樹和右子樹build(i*2+1,mid+1,r);tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;//剛才我們發現的性質return ; }

原理:

1、如果這個區間被完全包括在目標區間里面,直接返回這個區間的值 2、如果這個區間的左兒子和目標區間有交集,那么搜索左兒子 3、如果這個區間的右兒子和目標區間有交集,那么搜索右兒子

單點修改 區間查詢

(假如要修改一個點的值,父節點都要改(返回時涉及的點都要改))

區間修改 單點查詢

改一個區間的值:父節點上加標記,查詢的時候再一路加下去
如果這個區間如果這個區間被完全包括在目標區間里面,講這個區間標記k

區間修改 區間查詢

懶惰標記:

如果正好是需要修改的區間的子區間,那么暫時是不用往下改的,只加個懶惰標記就好,當不是的時候,那么就要先把自身的懶惰處理好,再將新的(部分修改的)往子樹上弄
當查詢的時候,如果真包含,那就不用處理直接回,如果不真包含,那就先把懶惰處理好,再往下查

乘法/根號線段樹

eg:
https://blog.csdn.net/icefox_zhx/article/details/78077506
bzoj1218 [HNOI2003]激光炸彈(二維前綴和+暴力/線段樹+離散化+掃描線)

總結

以上是生活随笔為你收集整理的线段树学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。