題意:給你乙個集合,集合裡沒有重複元素。集合可以新增元素,也可以刪除元素(前提是集合裡有),另外還有乙個詢問操作,問集合裡最小的差值是多少(只有乙個元素的時候詢問無效)
例如,集合開始的時候有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 #include3 #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 最小差值生成樹
求最小差值生成樹 考慮先把邊從小到大排序 從大到小也可以,就是反過來而已 然後一條條邊列舉,如果兩端點還未聯通,直接聯通 如果整個圖已經聯通了,此時可以理解為列舉了邊的最大值 因為邊權從小到大排序了 最大值確定,就應該要讓最小值越大越好,又因為要在這兩個端點行成的路徑上刪掉乙個點,那麼就刪掉環上權值...