幾個資料結構問題

2021-05-25 00:36:39 字數 1988 閱讀 7831

題目1描述:給定n個數字,數字是[1,c]的數字,給定m個區間詢問(n<=300000,c<=300000,m<=100000)

問是否存在》(r-l+1)/2的數字

分析:我們先來看這樣的兩個例子

奇數長度的區間 ******* 這裡我們將區間內的數字排了個序 

[      ]

[     ]

注意到沒,如果存在那樣乙個數,那麼至少是比這兩個區間大的區間滑動

可以發現無論這個區間是怎麼樣的,一定包含第(r-l+1)/2+1小的數 可以用鴿巢定理來解釋

於是假定存在這樣乙個數x,那麼必定是第(r-l+1)/2+1小的在這個區間,同理偶數長度

這個問題我們可以在logn內獲得答案利用劃分樹

接下來我們怎麼確定存不存在呢,我們把這個子問題轉化一下變成

對於給定的乙個x在區間[l,r]內出現的次數

我們可以建立c個平衡樹每顆樹儲存該值所有的位置,來獲取區間內的和

當然也可以直接二分來獲得,那麼總的複雜度為nlogn+mlogn 空間複雜度為nlogn+c

題目2描述:給定乙個長為n的序列,找k個互不相同的區間,且區間長度在[l,r]內(n,k<=500000)

使得這k個區間的和最大

做法1:是列舉所有區間排序,取前面k個大的區間和,複雜度n*n*logn

做法2:對於乙個區間[i,j]的和,我們可以用s[i]-s[j-1]來表示

設dp[i]=s[i]-min(s[j]) (l<=i-j<=r 即 i-r<=j<=i-l)表示以i結尾的最大區間和

我們顯然我們肯定是先找區間和最大的,然後區間和次大的,直到找出k個,

那麼這k個中,潛在的存在著這些dp[i],當然不一定是全部(為什麼後面會講到)

於是我們可以用乙個堆來維護這樣的三元組(i,j,k),表示以i結尾的第k大的區間和所對應的j

因為對於乙個i而言,所有的範圍內的j,可能有多個都比較大,所以每次操作完乙個[j,i]區間後

我們必須能夠快速的直到下乙個大的j,即尋找區間內的第k大問題,這個可以利用劃分樹

在logn時間內獲得,然後再把這個新的三元組插入到堆中

於是這個問題就可以在nlogn時間內解決了

做法3:根據此題,本質上來說是尋找這樣的若干個區間,我們假定還是以i結尾,那麼j值呢是在

某個區間[l,r]內的,對於乙個i,我們取得區間內的最值,顯然這個j不能再用了,於是它吧區間

**成[l,j-1] [j+1,r],那麼又是新的三元組,對於i的維護,我們還是利用堆來完成i的選取

整體複雜度為nlogn,空間複雜度為nlogn

其中區間最值查詢可以用rmq預處理出來,至此問題圓滿完成

題目3描述:給定n個數字,組成序列,有m個操作,操作1:指定區間內[l,r]所有元素+det (n,m<=100000)

操作2:詢問指定區間內的最長連續遞增序列

分析:如果只有操作1,那麼我們很容易利用線段樹來維護區間的和,只需要在區間上加入增量v

然而對於詢問,我們需要處理子區間的合併,於是我們需要三個變數lm,rm,mm,這段區間從左開始的最長連續遞增

到右結束的最長連續遞增,整大段區間的連續最長遞增,然而對於區間的合併,我們還需要知道端點處具體的值

所以還需要區間邊界上真實的值,通常來說我們利用懶惰標記,當需要時才更新來達到logn的維護級別,因為區間最多

下沉logn次,上浮logn次,可以用down和up來描述,對於任何一種操作,我們始終先down後up,down時更新當前

區間的左右真實值,同時將v下傳,在下降過程中,v始終是真實的,所以對於未來up時,兩個子區間的邊界是真實值

於是要傳遞給父親,這樣保證了來回一次傳遞後邊界的正確性,其中lm,rm,mm的維護在up中操作

這樣我們就可以在logn時間內完成修改和查詢,總的複雜度為nlogn

就是那個資料結構

少年的肩應擔負起草長鶯飛和清風明月,女孩的眼應藏下星辰大海和萬丈光芒 晚安之後,有時候想你想得睡不著,有時候不想你睡不著 目錄 資料結構的基本概念 線性表順序表 單鏈表迴圈單鏈表 雙向迴圈鍊錶 棧 順序棧待寫。有n個元素的順序表,第i個位置上插入乙個元素需要移動表中n i 1個資料元素,刪除第i個文...

網路程式設計中重要的幾個資料結構和函式

struct in addr struct sockaddr in struct in6 addr struct sockaddr in6 struct sockaddr struct sockaddr storage 這兩個是隨ipv6一起出現的新函式,支援ipv4和ipv6,函式名稱中p的意思是...

資料結構鐵軌問題 資料結構練習專題

下面我給大家帶來一些資料結構的題,供大家欣賞 一 棧 鐵軌試題描述 某城市有乙個火車站,鐵軌鋪設如圖所示,有n節車廂從a方向駛入車站,按進站順序編號為1至n。你的任務是判斷是否能讓它們按照某種特定的順序進入b方向的鐵軌並駛出車站。為了重組車廂,你可以借助中轉站c。這是乙個可以停放任意多節車廂的車站,...