顧名思義,二維線段樹就是在一棵線段樹的每乙個節點,都儲存著另一棵線段樹的根節點編號。
二維線段樹通常支援以下2種功能:
1、單點修改;
2、二維區間查詢。
為了實現這兩種功能,我們需要建一棵外層線段樹(可以動態開點也可以靜態開點),對於外層線段樹的每乙個節點,我們都儲存乙個內層線段樹的根節點編號(內層線段樹必須動態開點,否則mle)。
**:
#define sz 100000
struct hh
out[sz<<1];//外層線段樹
struct hhh
in[sz<<7];//內層線段樹
在單點修改時,要在外層線段樹查詢點的一維,並沿途修改內層線段樹。內層線段樹查詢點的另一維,找到後修改並回溯。
**:
#define sz 100000
void modify_in(int &k,int l,int r,int y,int v)//內層修改
void modify_out(int &k,int l,int r,int x,int y,int v)//外層修改
二維區間查詢時,與普通線段樹很像,但要在鎖定一維後在內層線段樹查詢另一維,然後才能得出答案。
**:
#define sz 100000
int query_in(int k,int l,int r,int y1,int y2)//內層查詢
int query_out(int k,int l,int r,int x1,int x2,int y1,int y2)
這便是二維線段樹的全部實現方法。
實戰:1、poj2029 get many persimmon trees
2、poj1195 mobile phones
3、洛谷4093 序列
(洛谷4093:我的另一篇部落格內給出了題解
二維線段樹
二維線段樹一般用樹套樹的方式實現,每個外層線段樹的節點對應一顆內層線段樹,整個線段樹存放在乙個二維陣列中。二維線段樹 poj2155 include include include include include include include include include include inc...
二維線段樹
二維線段樹矩陣區間查詢最大值 矩陣求和預處理後o 1 就能算出來,不用線段樹,除非有修改操作 先第一維在第二維,注意建樹有個順序問題,應該讓第一維度的先建完然後再建第二個維度 具體看 include include include using namespace std const int maxn...
二維線段樹
一維線段樹用來維護一維的空間,即乙個線段。二維線段樹用來維護二維的空間,即乙個矩形。二維線段樹的每個結點都是一棵一維線段樹,所以結構體陣列要開二維,再加上線段樹本身的性質,會占用很大記憶體,要儘量減少結構體內儲存的值的個數和長度,考慮到每個節點表示的線段的左右端點可以作為函式引數,所以不再儲存在結構...