資料結構 二維線段樹

2021-08-15 15:29:26 字數 964 閱讀 4941

顧名思義,二維線段樹就是在一棵線段樹的每乙個節點,都儲存著另一棵線段樹的根節點編號。

二維線段樹通常支援以下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...

二維線段樹

一維線段樹用來維護一維的空間,即乙個線段。二維線段樹用來維護二維的空間,即乙個矩形。二維線段樹的每個結點都是一棵一維線段樹,所以結構體陣列要開二維,再加上線段樹本身的性質,會占用很大記憶體,要儘量減少結構體內儲存的值的個數和長度,考慮到每個節點表示的線段的左右端點可以作為函式引數,所以不再儲存在結構...