1、前言
表示今天學的東西還是挺多的,資料結構一直以來內容就多。第四題比以前做過的一道題還水一些,結果沒有寫出來。
2、r r的煩惱
大概題意:給出乙個長度為n的數列,共t個操作,每次可以將一段區間增加x,也可以尋找數列中最左端和最右端的k,輸出距離。
總結:考試的時候並沒有寫出來,只能想到線段樹,但是顯然維護起來是要死的。開始只聽說過分塊,但是並沒有去試過,可能也是因為用的不是很多。這道題的話用分塊是很好做的,時限是3s,是可以過的。
題解:分塊。由於我們需要尋找最左端的某個值和最右端的某個值,線段樹若要維護某個值的位置,太麻煩了。首先我們想一下暴力的寫法。區間修改,直接for迴圈;尋找k,從左和從右進行兩次for迴圈。如何加快速度?我們考慮將這個數列均勻的分成若干塊,對每一塊進行處理。
類似於線段樹,我們在某些情況下,為了降低複雜度,會給一些目前暫時不需要進行修改或詢問操作的區間先做乙個標記,表示這一段將要加上某個數。假設當前給[l,r]增加x,可能橫跨多個塊,對於中間的塊直接上標記;對於左右側沒有全覆蓋的塊,直接進行暴力加減。
詢問的過程看起來似乎複雜度就比較高了,其實不然。我們每次對某個塊進行修改之後,可以將其從小到大(反之亦然)進行排序,那麼在每個塊中詢問某個數的時候,可以直接二分答案。
這一切貌似並不是很高階的東西,但是它的最低複雜度遠低於暴力列舉。為何稱之為最低?注意到,分塊的大小我們並沒有定義。而從上述描述中也可以看出來,塊的大小似乎並不影響程式的正確性,故我們只需要找到乙個最合適的大小,使複雜度最低。一般情況下,大小選取√n,也可以自己去定。平均複雜度為o(t * (√n log √n),3s是可以過的。
3、card 神秘卡片
略。4、captain 分隊
大概題意:給出n個點,每個點存在兩個值a[i],b[i]。共t次詢問,每次詢問給定兩個數,要求找出包括這兩個數的乙個數集合,滿足:集合中a值最高者i,b[i]與其他數的b的絕對值相差小於等於k。
題解:從50分做法想起。由於分組的規則只和a值最高者有關,那麼我們先預處理出每乙個數作為最高者的情況下,隊伍中最多可以存在多少個人。詢問過程中,每次要找到乙個a值大於等於兩者較高者的點,同時b值滿足條件,選擇隊伍中人最多的情況即可。這樣,時間複雜度為o(n ^ 2 + t * n),顯然是過不了的。
如何將乙個n優化掉?第一步,預處理過程中,因為和位置無關,則可以排序之後用樹狀陣列維護。第二步詢問,我們可以離線進行回答。將每次的詢問按要求的最小a值排序,將每乙個人按a排序後加入,依次回答詢問。這樣可以用線段樹來維護最大人數了,時間複雜度o(n log n + t * log n)。
5、qtree xdz的難題
大概題意:給出一棵根節點為1的樹,維護下列幾個操作——將根換為x,將乙個節點權值改為v,詢問乙個子樹中所有節點的最小值。
題解:bzoj上遙遠的國度的簡化版,不要用樹鏈剖分維護,直接線段樹。不要看到換根就自動腦補動態樹云云了,這道題只需要考慮詢問子樹的根節點與整棵樹當前的根節點的關係即可。
用線段樹維護,加上換根操作,記當前的根為root,詢問子樹的根為x,如果root不在x的子樹裡,仍然維護原來的就行;否則如圖所示(顯然不是我畫的。。。),除了紅色部分以外,以x為根節點的子樹就是所求部分,也就是x最近的屬於root到1路徑上的點,在dfs序上是連續的一段,故直接用線段樹即可。
自學考試 資料結構
1.帶頭結點的單迴圈鍊錶的頭指標為head,則判斷該鍊錶是否為空的條件是head next head 2.不需要判斷棧是否為空的是 進棧 3.對於任意一棵二叉樹,如果其葉結點數為n0,而度數為2的結點總數為n2,則n0 n2 1 4.m個葉結點的哈夫曼樹中,其結點總數為2m 1 5.用n表示圖中頂點...
資料庫考試之 資料結構
1.線性表 1 線性表定義 線性表是一類最簡單,最常用的資料結構。簡單來說,乙個線性表是n個元素的有限序列,其中n 0,通常表示為 a1,a2,an 其特點是,在非空的資料元素結合中 1 存在唯一個的乙個稱作 第乙個 的元素 2 存在唯一的乙個稱作 最後乙個 的元素 3 除第乙個元素外,集合中的每個...
資料結構實驗考試(希爾排序)
資料結構實驗考試 希爾排序 希爾排序具體 includeint count 0 void shellsort int a,int st,int ed while j st a j temp a j step temp if step 1 int main int len 9,i printf 待排順...