複習 整體二分求區間第K大

2021-08-10 13:25:03 字數 514 閱讀 1227

給定乙個長度為n的序列與m個(l,r,k)詢問區間[l,r]中第k大。

考慮單個詢問的解決,我們可以二分答案然後統計比他大的數的個數。那麼時間複雜度就是n log m.

但多個詢問如何解決? 我們可以整體地二分答案區間[l,r]。 然後將詢問集合分割,分到[l,mid]與[mid+1,r]的子分治過程中處理。

現在要做的就是如何快速計算每個詢問的區間中有多少個大於mid的數。

先將原序列排乙份序,稱作b,就直接在這個上面二分答案。

對於答案區間為[l,r],詢問集合為q的分治過程,我們可以這麼做:

1) 將b中區間[mid+1,r]的原序列位置標記為1.(樹狀陣列即可)

2) 對於每個詢問求一次[l,r]的區間和,並且判斷該分到[l,mid]的一邊還是[mid+1,r]的一邊

(左邊的k的不要忘記減去目前比他大的個數,因為這些之後不會再被統計到)

3) 清空樹狀陣列

4) 繼續分治

分析一下時間可以發現,應該是m * log(n)^2

P3834 (靜態區間第k大,整體二分)

題意 給定長度為n的序列a,m次詢問,每次詢問給出l,r,k,要求計算 l,r 的第k小數 資料範圍 n,m 2e5,1e9 a i 1e9 解法 整體二分的主要思想 對需要在值域 l,r 內二分的所有詢問,共用乙個二分,相比每個詢問於單獨二分,減少了二分總次數 整體二分是離線演算法。需要注意的點 ...

靜態區間第K小(整體二分 主席樹)

題目鏈結 題解主席樹入門題 但是這裡給出整體二分解法 整體二分顧名思義是把所有操作放在一起二分 想想,如果求 1 n 的第 k 小怎麼二分求得?我們可以二分答案 k o n 統計有多少個數小於等於 k 如果對於每個詢問都這麼搞,肯定不行 我們可以發現,如果每次都搞一次,有許多算重複的地方 div l...

求區間第k大

int a mx void insert int a,int l,int r int divide int a,int l,int r 劃分子問題 a l x return l int select int s,int l,int r,int k,int len 返回s陣列l r的第k大數的下標 w...