一天一道演算法題 線段樹

2022-05-06 17:33:36 字數 2612 閱讀 3383

題目【模板】線段樹1:

rmq問題(range minimum/maximum query)和求區間和的問題可以用暴力法做,時間複雜度為o(n^2),用在本題會超時,所以我們選擇線段樹做。

線段樹是一種用於區間操作的資料結構,用二叉樹構造。如圖。

線段樹的每個節點代表了乙個區間。

防止超時,用了lazy標記。

1 #include2 #include3

#define maxn 100010

4 typedef long

long

ll;5

using

namespace

std;67

struct

node tree[maxn<<2+2

];10

int n, root = 1

;11 ll num[maxn+2], addv[maxn << 2+2];//

addv可以放在node裡面

12void pushup(int

x) 15

void pushdown(int

x) 23}24

void buildtree(int l,int r,int

x) 27

int mid = (l + r) >> 1

;28 buildtree(l, mid, x << 1

);29 buildtree(mid + 1, r, (x << 1) + 1

);30

pushup(x);31}

32void add(int l, int r, int k, int

x) 38

pushdown(x);

39int mid = (tree[x].l + tree[x].r) >> 1;40

if (l <= mid) add(l, r, k, x << 1

);41

if (r > mid)add(l, r, k, x << 1 | 1

);42

pushup(x);43}

44 ll print(int l, int r,int

x) 54

intmain()

67else72}

73return0;

74 }

ε=(´ο`*)))唉

題目2【模板】線段樹2:

比上面多了乙個求區間乘法。

需要考慮清楚乘法和加法誰先誰後的關係。

1 #include2 #include3

#define maxn 100010

4 typedef long

long

ll;5

using

namespace

std;67

struct

node tree[maxn<<2

];11

int n, root = 1

,p;12 ll num[maxn], addv[maxn << 2], mult[maxn << 2

];13

void pushup(int

x) 16

void pushdown(int

x) 25

void buildtree(int l,int r,int

x) 28

int mid = (l + r) >> 1

;29 buildtree(l, mid, x << 1

);30 buildtree(mid + 1, r, x << 1|1

);31

pushup(x);32}

33void add(int l, int r, int k, int

x) 39

pushdown(x);

40int mid = (tree[x].l + tree[x].r) >> 1;41

if (l <= mid) add(l, r, k, x << 1

);42

if (r > mid)add(l, r, k, x << 1 | 1

);43

pushup(x);44}

45void multiply(int l, int r, int k, int

x) 52

pushdown(x);

53int mid = (tree[x].l + tree[x].r) >> 1;54

if (l <= mid)multiply(l, r, k, x << 1

);55

if (r > mid)multiply(l, r, k, x << 1 | 1

);56

pushup(x);57}

58 ll print(int l, int r,int

x) 68

intmain()

81else

if (k == 1

) 86

else91}

92return0;

93 }

view code

因為乙個加號除錯了乙個晚上o(╥﹏╥)o

一天一道演算法題 樹狀陣列

題目 模板 樹狀陣列1 樹狀陣列和線段樹差不多,可以處理區間操作,但是處理不了太複雜的區間問題。不過 比線段樹簡潔很多很多!時間複雜度都為o logn 例如,區間 1,8 儲存方式如下 1 tree 1 num 1 001 001 2 tree 2 num 2 num 1 010 010 001 3...

一天一道演算法題 5 24 遞迴

我們每一天都應該比昨天更強一點 觀察下列式子 12 12 1 12 6 2 12 4 3 12 3 4 12 3 2 2 12 2 6 12 2 3 2 12 2 2 3 對於給定的n 計算n公有多少種不同的分解式?1 include 2 using namespace std 34 int cnt...

一天一道演算法題 之動態規劃

最近做了幾道動態規劃題,發現了其中一些規律,認真覆盤一下。先來看幾道題。1 機械人走方格 有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。注意網格中有些障礙點是不能走的。給定乙個intmap c 中為vector 表示網格圖...