線段樹處理集合裡的最小差值

2022-04-11 17:55:40 字數 1329 閱讀 3392

題意:給你乙個集合,集合裡沒有重複元素。集合可以新增元素,也可以刪除元素(前提是集合裡有),另外還有乙個詢問操作,問集合裡最小的差值是多少(只有乙個元素的時候詢問無效)

例如,集合開始的時候有1 7兩個元素,那麼最小差值就是6。當再新增乙個新的元素3,集合就變成了1 3 7,那麼最小差值就是2。

解法:對於每乙個區間線段,我們給它3個屬性,最小值minf,最大值maxf,以及最小差值deff。

從下而上,我們很容易可以看出,某乙個線段 i 的最小值為min(left_child[i].minf,right_child[i].minf)

最大值為max(left_child[i].maxf,right_child[i].maxf)

最小差值等於min(min(左右子區間的最小差值),右子區間的最小值減去左子區間的最大值)

view code

1 #include2 #include

3 #include4 #include5

using

namespace

std;

6#define inf 0xfffffff78

struct

node9;

1617 node tree[1000000

];18

19int max(int a,int

b)20

2324

int min(int a,int

b)25

2829

void build(int i,int l,int

r)30

4243

intquery()

4447

48void updata(int

i)49

5556

void add(int i,int l,int

r)57

66 add(2*i,l,r);

67 add(2*i+1

,l,r);

68updata(i);69}

7071

void det(int i,int l,int

r)72

81 det(2*i,l,r);

82 det(2*i+1

,l,r);

83updata(i);84}

8586

intmain()

87108

else

if(str[0]=='r'

)109

113else

114118

}119

}120

return0;

121 }

BST中的最小差值

給定乙個確定根的二叉搜尋樹,返回樹中任意兩個不同節點的值的最小差。樣例1 輸入 root 輸出 1 解釋 請留意,root是乙個樹節點的結構,而非乙個普通陣列。給定的樹的樣子如下圖 4 2 6 1 3 在這棵樹中,最小數值差距為 1,它出現在node 1 與 node 2 之間,也同時存在 node...

P4234 最小差值生成樹

題目鏈結 題目描述 給定乙個點標號從 1 11 到 n nn 的 有 m mm 條邊的無向圖,求邊權最大值與最小值的差值最小的生成樹。圖可能存在自環。輸入格式 第一行有兩個整數,表示圖的點數 n nn 和邊數 mmm。接下來 m mm 行,每行三個整數 u,v w u,v,w u,v,w,表示存在一...

P4234 最小差值生成樹

求最小差值生成樹 考慮先把邊從小到大排序 從大到小也可以,就是反過來而已 然後一條條邊列舉,如果兩端點還未聯通,直接聯通 如果整個圖已經聯通了,此時可以理解為列舉了邊的最大值 因為邊權從小到大排序了 最大值確定,就應該要讓最小值越大越好,又因為要在這兩個端點行成的路徑上刪掉乙個點,那麼就刪掉環上權值...