簡單資料結構

2021-08-15 18:51:25 字數 1997 閱讀 5480

一、樹狀陣列

樹狀陣列是一種支援單點修改區間查詢的資料結構,這個陣列是以二進位制的形式儲存的,例如7的二進位制是111,最右邊1代表1,那麼c[7]就是從a[7]往前1個數這個區間所有a陣列值的和,再例如8的二進位制是1000,最右邊的1代表8,那麼c[8]就代表從a[8]往前8個數(1-8)這個區間所有a陣列值的和。

樹狀陣列有兩個操作,修改和查詢。

修改是往上修改,也就是例如修改a[1],則先修改c[1],再向上修改c[2],然後c[4],直到n為止。

而查詢則是向下查詢,例如查詢前6個數的和,則ans先+=c[6],再+=c[4]。

而無論是修改的從1到2,再到4,再到8,還是查詢的從6到4,都需要乙個lowbit操作也就是x=x&(~x).

這樣就可以在樹狀陣列上進行操作了。

二、線段樹

線段樹是乙個二叉樹,每個節點儲存的是一段區間的資訊,根節點自然就是1-n總區間的資訊,

而每個節點的兩個子節點則是l到(r-l)/2和(r-l)/2+1到r這兩段區間的資訊。

線段樹有四種操作:區間修改,區間查詢,單點修改,單點查詢,

單點修改和單點查詢直接用類似二分查詢的方法來做就行了,

區間查詢:

例如乙個1-8的線段樹,如果要查詢3-7,那麼先判斷3和7分別在左子樹還是右子樹,如果都有,那麼分別修改。

先進入左子樹,發現3-4這個節點被3-7完全包含那麼直接取這個節點的資訊,再看右子樹,發現5-6這個節點被完全包含,也直接取這個節點的資訊,再找7-8這個節點,發現未完全包含,則再往下查詢,又發現7這個節點被完全包含,也直接取這個點的資訊。

區間修改:

區間修改是最難的乙個操作,他需要用到乙個懶惰標記。還用上乙個的例子,修改3-7的所有數的值都加1,發現3-4被完全包含,那麼將這個節點打上乙個值為1的懶惰標記,同樣5-6和7兩個節點也打上乙個值為1的懶惰標記,而當再查詢的時候,例如查詢的3的值,發現走到3-4這個節點時有乙個懶惰標記,那麼就將這個標記下傳到兩個子節點。

總結一下就是,修改時當發現整個區間都包含時就打上乙個標記,當查詢到有標記的節點上時,就把標記下傳。

下面給乙個區間修改區間查詢的模板

#include#include#include#include#include#include#define ls l,m,root<<1

#define rs m+1,r,root<<1|1

#define ll long long

using namespace std;

ll sum[8000001];

ll a1[8000001];

void add(int root)

void build(int l,int r,int root)

int m=(l+r)>>1;

build(ls);

build(rs);

add(root);

return;

}void sign(int root,int len)

}void change(int l,int r,int c,int l,int r,int root)

sign(root,r-l+1);

int m=(l+r)>>1;

if(l<=m)

if(m+1<=r)

add(root);

}ll find(int l,int r,int l,int r,int root)

sign(root,r-l+1);

ll tot=0;

int m=(l+r)>>1;

if(l<=m)

if(m+1<=r)

return tot;

}int n,m;

int a,b;

char q[4];

int main()

if(q[1]=='q')

}return 0;

}

簡單資料結構

編碼定義的變數在執行時的會存放在記憶體中的靜態儲存區 棧區或堆區 1.申請一塊連續的空間 陣列 可以存放在上述的三個區中 2.申請可變長的空間 鍊錶 只能存放在堆區中 其他所有的資料結構在記憶體中存放時,都只能是陣列或者鍊錶的結構,只是在 邏輯上怎麼使用而已。棧的使用 後進先出 計算簡單加減乘除式子...

簡單資料結構 佇列

第一次發csdn部落格,有點小激動,因為自己看了不少csdn裡的大牛的博文,很崇拜。心想著什麼時候自己也寫一篇。現在是時候了。接觸c語言有三年了,但是僅僅是皮毛,而且在學校也很少用,現在為做畢設,用到佇列,發現已經忘得一乾二淨,於是重新翻書,寫此算做筆記。內容如有不當還請諸位指出。佇列 是一種線性表...

簡單資料結構的實現之順序棧

include using namespace std const int stack init size 100 ifndef sqstack h included define sqstack h included template class sqstack int stacklength e...