無聊的木頭 初識set(紅黑樹)

2021-10-05 14:43:16 字數 2048 閱讀 6531

c++有著豐富的函式以及各種容器,這極大的精簡的**。

在看火影第二部的時候,我們都知道,為了節省查克拉的使用,進而產生了一種容器,容器裡面裝有特定的技能,只要我們發射容器,就會產生和本身技能同樣的效果,這不僅節省了查克拉的使用,而且操作簡單,每個人都可以使用

c++set容器有著異曲同工之妙

set容器封裝了一種非常高效的平衡檢索二叉樹——紅黑樹,set中每個元素值都唯一,並且所有的元素都是以節點的方式來儲存。因此插入的時候只需要稍做變換,把節點的指標指向新的節點就可以了。刪除的時候類似,稍做變換後把指向刪除節點的指標指向其他節點也ok了。這裡的一切操作就是指標換來換去,和記憶體移動沒有關係。

vector封裝了陣列

list封裝了鍊錶

map和set一樣。

begin()    ,返回set容器的第乙個元素

end()      ,返回set容器的最後乙個元素

clear()    ,刪除set容器中的所有的元素

empty()    ,判斷set容器是否為空

max_size()   ,返回set容器可能包含的元素最大個數

size()      ,返回當前set容器中的元素個數

rbegin     ,返回的值和end()相同

rend()     ,返回的值和rbegin()相同

題目描述

現有一堆無聊的木頭,它們的長度已知且排成一行,突然有一天,第一塊木頭突發奇想,它想要知道在它的右邊比它長度次小的木頭是哪一塊,於是

它把這個想法告訴了其他木頭,而其他木頭對於它這個想法也十分好奇,但是木頭實在太多了,因此你需要告訴它們在它們右邊的哪一塊木頭的長度比它次小,也就是找到

比它次小的那塊木頭的位置。

輸入

第一行輸入乙個t(t <= 20),表示測試資料組數。

接下來t行,每行首先輸入乙個n(n <= 100000),表示木頭的個數,之後輸入n個正整數,分別表示木頭的長度(木頭長度<=1000000)

輸出

輸出n個滿足條件的答案,注意如果沒有滿足條件的答案你只需要輸出0就好了,如果對於某塊木頭有多個滿足條件的答案,你需要輸出答案盡量小的那乙個。

樣例輸入

16 10 9 26 10 10 18

樣例輸出

2 0 6 0 0 0

題目分析

1.次小——僅次於該高度的高度

2.題目要求在右邊尋求次小木頭,那我們就反向遍歷,依次將木頭的高度存入set容器中,也是因為在右邊尋找,那麼最右邊的木頭肯定為0,…這樣依次下去就簡單了許多

3.對於第i個木頭用lower_bound函式找到大於等於該木頭高度的木頭高度h,它的前乙個就是次小的木頭高度,h已經是第乙個,也就意味著沒有木頭比第i個木頭小

4.我們用id陣列儲存第i個木頭的位置

5.我們比較和返回的都是位址,但是在位址的前面加乙個*號就代表這個元素的值

ac**

#include

using

namespace std;

const

int maxn =

1e6+10;

int a[maxn]

, b[maxn]

, id[maxn]

;int

main()

for(

int i =

1; i <= n;

++i)

printf

("%d%c"

, b[i]

, i == n ?

'\n'

:' ');

}return0;

}

有詩和遠方的人,生活不會寂寞

初識紅黑樹

紅黑樹的五個基本特性 1.每個節點要麼是紅的,要麼就是黑的 2.根節點一定是黑的 3.每個葉子節點一定是黑的,就是 nil 4.如果乙個雙親節點是紅的,那麼他的子節點一定是黑的 5.對每個節點,從該節點到其子孫節點的所有路徑上包含相同數目的黑節點 紅黑樹的插入和刪除操作會違背紅黑樹的原有性質,為了避...

初識紅黑樹

查詢很簡單,跟二叉查詢樹是類似的,以上圖為例,查詢8的話,首先跟根節點13比較,8小於小於13,於是去左子樹中查詢,8又大於6而小於9於是去這個結點的中子樹中查詢,命中。插入是非常重要的一步,正是在插入上邊體現了2 3樹的自下向上生長,保持了樹的平衡。也因此,插入要複雜一點點,我們分情況討論 2 3...

底層實現紅黑樹 Set原始碼解析(紅黑樹)

之前粗略看了一下list和map,今咱來聊一下set。主要看以下幾個 1 hashset 2 collections.synchronizedset 3 linkedhashset 4 copyonwritearrayset 5 treeset 一 hashset hashset是日常搬磚中最常用的...