線段樹的一些細節區別 以區間和為例

2021-09-17 22:14:17 字數 2229 閱讀 3111

直接暴力分割,在函式開頭檢測,不行就return。

三種條件分割(左,右,中間),只有在中間才分割。

以下是示例**(部分**,poj3468,ac)

#define ti tree[i];

struct node

void

print()

const};

const

int maxn =

100000+10

;node tree[maxn *4]

;int arr[maxn]

;#define ti tree[i]

void

push_up

(int i)

void

push_down

(int i)

}void

build

(int i,

int l,

int r)

int mid =

(l + r)/2

;build

(i *

2, l, mid)

;build

(i *2+

1, mid +

1, r)

;push_up

(i);

}void

update

(int i,

int ul,

int ur,

int val)

int mid =

(ti.l + ti.r)/2

;if(ur <= mid)

else

if(ul > mid)

else

}long

long

query

(int i,

int ql,

int qr)

int mid =

(ti.l + ti.r)/2

;if(qr <= mid)

else

if(ql > mid)

else

}void

print

(int i,

int l,

int r)

}

順序有影響的例子:區間塗色

順序沒有影響的例子:區間和

以下是示例**(部分**,poj3468,ac)

#define ti tree[i];

struct node

void

print()

const};

const

int maxn =

100000+10

;node tree[maxn *4]

;int arr[maxn]

;#define ti tree[i]

void

push_up

(int i)

void

push_down

(int i)

}void

build

(int i,

int l,

int r)

int mid =

(l + r)/2

;build

(i *

2, l, mid)

;build

(i *2+

1, mid +

1, r)

;push_up

(i);

}void

update

(int i,

int ul,

int ur,

int val)

else

int mid =

(ti.l + ti.r)/2

;if(ur <= mid)

else

if(ul > mid)

else

}long

long

query

(int i,

int ql,

int qr)

int mid =

(ti.l + ti.r)/2

;if(qr <= mid)

else

if(ql > mid)

else

}void

print

(int i,

int l,

int r)

}

一些關於線段樹的操作記錄

由於筆者本身總是弄不清楚線段樹的各種寫法之間的差異,故寫在這裡方便看懂題解 關於可持久化 關於各種玩意兒套線段樹 關於離散化 關於卡常 關於遞迴 關於權值線段樹 1.分三種情況遞迴的 完全在左子樹,完全在右子樹,和兩邊都有的 複雜度證明 兩邊都有的情況顯然只會出現一次,而樹高為log n log n...

前端和後端互動的一些細節

scrat小白一枚,此篇文章感覺收穫很大,分享給大家 原創主人 1.前端請求資料url由誰來寫?在開發中,url主要是由後台來寫的,寫好了給前端開發者.如果後台在查詢資料,需要借助查詢條件才能查詢到前端需要的資料時,這時後台會要求前端提供相關的查詢引數,這裡的查詢引數也就是url請求的引數。2.介面...

ACM走過的坑和一些細節

1.一道簡單計算幾何,區域性變數與全域性變數同名,然後忘記在函式內宣告區域性變數,然後編譯通過了。2.省賽選拔時,一道二分 bfs走迷宮的題,漏了起點和終點重合的情況,要注意一開始入隊的狀態是否是結束狀態。3.線段樹的一道題,len陣列記錄根節點所代表線段覆蓋的長度,有小數,改來改去,根本沒注意到l...