樹狀陣列與線段樹

2021-09-13 01:47:00 字數 1438 閱讀 5488

推一下關於樹狀陣列的講解部落格:

和線段樹的講解:

package test2;

public class _線段樹 ;

int len = a.length;

segtree t = buildtree(0, len - 1, a);

int sum0_2 = query(t, 0, 2);

int sum1_3 = query(t, 1, 3);// 查詢的和包括左區間和有區間

system.out.println(sum0_2);

system.out.println(sum1_3);

} // 構建線段樹

static segtree buildtree(int l, int r)

int mid = (l + r) / 2;

segtree.lson = buildtree(l, mid);

segtree.rson = buildtree(mid + 1, r);

segtree.sum = segtree.lson.sum + segtree.rson.sum;// 也可以求最值

return segtree;

} // 構建線段樹

static segtree buildtree(int l, int r, int a)

int mid = (l + r) / 2;

segtree.lson = buildtree(l, mid, a);

segtree.rson = buildtree(mid + 1, r, a);

segtree.sum = segtree.lson.sum + segtree.rson.sum;// 也可以求最值

return segtree;

} // 位置x的資料增量為y

static void update(segtree t, int x, int y)

t.sum += y;

int l = t.l;

int r = t.r;

int mid = (l + r) / 2;

if (x <= mid) else

} // 查詢區間[x,y]的和

private static int query(segtree t, int x, int y)

if (y > mid)

return cnt;

} // 單點查詢位置

static int query(segtree t, int k)

int mid = (l + r) / 2;

if (k <= mid)

if (k > mid)

return query(t.rson, k);

return -1; }}

class segtree

}

遞迴與非遞迴的講解:

樹狀陣列與線段樹(三)

找規律題 1.螺旋折線 如下圖所示的螺旋折線經過平面上所有整點恰好一次。對於整點 x,y 我們定義它到原點的距離 dis x,y 是從原點到 x,y 的螺旋折線段的長度。例如 dis 0,1 3,dis 2,1 9 給出整點座標 x,y 你能計算出 dis x,y 嗎?輸入格式 包含兩個整數 x,y...

樹狀陣列與線段樹(二)

樹狀陣列 1.小朋友排隊 n n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是 0 0 如果某個小朋友第一次被要求交換,則他的不高興程度增加 1 1 如果第二次要求他交換,則他的不...

線段樹與樹狀陣列學習總結 線段樹

點動成線 那麼就是說一條線段可以分成若干個點,再想想我們最常用的一維陣列,構成陣列的是乙個個的變數,如果把變數看成乙個個點,那麼陣列就是一條線了!而線段樹,就是一棵由線段構成的二叉樹,每個結點都代表一條線段 a,b 也就是我們前面說的一串變數 非葉子的結點所對應的線段都有兩個子結點,左兒子代表的線段...