(1):區間最值查詢問題
查詢區間最值下標---min
#includeusingnamespace
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 #includeusing
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...