線段樹應用

2022-03-18 13:50:44 字數 2029 閱讀 7267

(1):區間最值查詢問題

查詢區間最值下標---min

#includeusing

namespace

std;

#define maxn 100

#define maxind 256 //

線段樹節點個數

//構建線段樹,目的:得到m陣列.

void build(int node, int b, int e, int m, int

a)

}

//找出區間 [i, j] 上的最小值的索引

int query(int node, int b, int e, int m, int a, int i, int

j)

intmain()

;

build(

1, 0, sizeof(a)/sizeof(a[0])-1

, m, a);

cout

<1, 0, sizeof(a)/sizeof(a[0])-1, m, a, 0, 5)

0;

}

(2):連續區間修改或者單節點更新的動態查詢問題

#include #include 

using

namespace

std;

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

#define root 1 , n , 1

#define ll long long

const

int maxn = 111111

;

ll add[maxn

<<2

];

ll sum[maxn

<<2

];

void pushup(int

rt)

void pushdown(int rt,int

m)

}

void build(int l,int r,int

rt)

int m = (l + r) >> 1

;

build(lson);

build(rson);

pushup(rt);

}

void update(int l,int r,int c,int l,int r,int

rt)

pushdown(rt , r - l + 1

);

int m = (l + r) >> 1

;

if (l <=m) update(l , r , c , lson);

if (m pushup(rt);

}

ll query(

int l,int r,int l,int r,int

rt)

pushdown(rt , r - l + 1

);

int m = (l + r) >> 1

;

ll ret = 0

;

if (l <= m) ret +=query(l , r , lson);

if (m < r) ret +=query(l , r , rson);

return

ret;

}

intmain()

else

}

return

0;

}

摘自:

線段樹的應用

標籤 空格分隔 c 資料結構 有時候我們求乙個給定的平面直角座標系中的n個矩形的面積,而此時,我們就需要引入一種高效且奇妙的演算法 掃瞄線。例如該圖 我們將其中的矩形按上下邊,構建4條掃瞄線,並按照y值大小進行排序,並標記為上或下。但是由於矩形的x座標有4個,並且相互關聯,而想要提公升演算法效率就必...

線段樹的基礎應用

大約為葉子節點的4倍 線段樹父節點的資訊可以利用up 從子節點提取的 同時線段樹樹上可以通過down 將父節點的資訊給子節點 void tree int l,int r,int p void build int l,int r,int p 以求區間和為例 void update int x,int ...

線段樹應用 掃瞄線

掃瞄線暴力解決的話時間和空間複雜度往往是不夠的。所以,掃瞄線也就成了線段樹很大的應用。具體原理解釋 寫得很好 很好 給出模板 第一篇部落格 饒齊大佬 的修正與改進,還有一些地方的解釋,錯誤原因 第乙個 二維平面有n個平行於座標軸的矩形,現在要求出這些矩形的總面積.重疊部分只能算一次.includeu...