關於線段樹基礎

2021-09-14 08:43:30 字數 2885 閱讀 6848

必須:二分法,樹的基礎

拓展:補碼,反碼,移碼,lowbit()

了解什麼是線段樹及用途

線段樹,類模板題

just a hook

#include

#include

#include

#include

#include

using namespace std;

const

int t=

100009

;struct nodetree[t<<2]

;void

pushdown

(int rt)

void

build

(int l,

int r,

int rt)

build

(l,tree[rt]

.mid,rt<<1)

;build

(tree[rt]

.mid+

1,r,rt<<1|

1);}

void

add(

int l,

int r,

int v,

int rt)

if(tree[rt]

.v!=-1

)pushdown

(rt);if

(r<=tree[rt]

.mid)

else

if(l>tree[rt]

.mid)

else

}int

find

(int rt)

intmain()

printf

("case %d: the total value of the hook is %d.\n"

,++c,

find(1

));}

return0;

}

拓展:敵兵布陣

其中用到了lowbit()函式,相比其餘方法的**可以說是精簡了不少,但要明白其中的原理,還需掌握補碼,反碼,移碼等相關知識。

#include

#include

#include

#include

#include

#include

using namespace std;

int c[

50100];

intlowbit

(int t)

intgetsum

(int n)

return sum;

}void

change

(int i,

int v,

int n)

}int

main()

char cmd[10]

;while

(scanf

("%s"

,cmd)

,cmd[0]

!='e'

)else

if(cmd[0]

=='s'

)else}}

return0;

}

正常做法
#include

#include

using namespace std;

const

int maxn =

5e4+10;

int ans;

struct node tree[maxn *4]

;void

build

(int left,

int right,

int rt)

int mid =

(tree[rt]

.left + tree[rt]

.right)/2

;build

(left, mid, rt *2)

;build

(mid +

1, right, rt *2+

1); tree[rt]

.sum = tree[rt *2]

.sum + tree[rt *2+

1].sum;

}void

update

(int left,

int right,

int rt,

int pos,

int add)

int mid =

(tree[rt]

.left + tree[rt]

.right)/2

;if(pos <= mid)

else

tree[rt]

.sum = tree[rt *2]

.sum + tree[rt *2+

1].sum;

}void

query

(int left,

int right,

int rt,

int l,

int r)

int mid =

(tree[rt]

.left + tree[rt]

.right)/2

;if(r <= mid)

else

if(l > mid)

else

}int

main()

cin >> a >> b;

if(str[0]

=='q'

)else

if(str[0]

=='a'

)else

if(str[0]

=='s')}

}return0;

}

最後

線段樹還有更多的用法,比如區間修改,掃瞄線,非遞迴寫法等,詳見這篇文章:

線段樹 01 線段樹基礎

物理上 public class segmenttree public int getsize public e get int index 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引 private int leftchild int index 返回完全二叉樹的陣列表示中...

關於線段樹

首先肯定推薦學姐部落格!炒雞優秀的學姐!主要是貼 並沒有什麼理論的講解。例題 洛谷p3372 模板 線段樹1 洛谷p3373 模板 線段樹2 線段樹支援單點查詢 單點修改 區間查詢 區間修改等操作。基本思想是二分 將線段樹節點用乙個結構體打包起來 建樹 build 1,1 n void build ...

線段樹 基礎

d 基礎 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿...