主席樹 計蒜客 攀登山峰 CF840D

2021-10-25 08:39:47 字數 1392 閱讀 4611

題目大意:

給你乙個長度為n

nn的序列,q

qq次詢問。每次詢問乙個區間[l,

r]

[l,r]

[l,r

]**現次數超過 r−l

+1

t\frac

tr−l+1

​的最大值.

n ,q

≤1e5

,t≤20

n,q \leq 1e5,t\leq20

n,q≤1e

5,t≤

20題目思路:

核心思路:主席樹+搜尋.

主席樹可以獲取乙個區間的值域資訊。在搜尋時,我們優先往右走。如果右邊的數的總數 ≥r−

l+1t

\geq \frac

≥tr−l+

1​複雜度分析:

可能會覺得搜尋時間複雜度會很大。但是觀察到t

tt很小。考慮乙個最差情況:

當我們搜尋到葉子節點的時候,代表著這個值出現了超過r−l

+1

t\frac

tr−l+1

​次。那最壞情況就是,每次搜到快到葉子節點時,然後查詢失敗了.

這樣,我們可以近似看成搜尋 t

tt條鏈.單次詢問複雜度為:o(t

logn

)o(tlogn)

o(tlog

n)總時間複雜度:o(q

tlog

n)

o(qtlogn)

o(qtlo

gn) 可以過。

ac**:

#include

using

namespace std;

#define mid ((l + r) >> 1)

const

int maxn =

1e5+5;

int a[maxn]

;int sum[maxn <<5]

, ls[maxn <<5]

, rs[maxn <<5]

, rt[maxn]

, cnt;

int add (

int l ,

int r ,

int t ,

int p ,

int c)

int ask (

int u ,

int v ,

int l ,

int r ,

int k)

if(sum[ls[v]

]- sum[ls[u]

]>= k)

return-1

;}int dist[maxn]

, tot;

intmain()

return0;

}

2020 計蒜之道 線上決賽 C 攀登山峰

乙個序列 a i 每次詢問 l,r,t 表示詢問 l,r 內出現了大於 frac 次的最大的數是什麼。n le 10 5 感覺這題之前cf見過,直接搬那題的做法。tle。事實證明這題正解比cf那題高到不知道 去了。維護權值線段樹,建主席樹,表示一段字首中每個樹各自的出現次數。線段樹上維護和。查詢的時...

計蒜客 項鍊 (主席樹 離線 樹狀陣列)

題目大意就跟洛谷的hh項鍊一樣,但是求一串區間內不重複數字的和。一種做法是離線 樹狀陣列,這裡不講。主要講一下新學習的技能,用主席樹搞區間內不重複的數字 個數或者和 由於洛谷那個寫炸了,一直mle 不知道被什麼資料卡了 只好拿計蒜客上面的題來試一下,結果計蒜客的能過。主席樹做法和樹狀陣列相同,對於同...

計蒜客 泥塑課C

描述 小公尺是乙個幼兒園老師,每學期的泥塑課上,她都會給每個學生發不超過 250 立方厘公尺的等量橡皮泥,教大家做泥塑。在上課過程中,她發現每個班都恰好有乙個小朋友會去搶另乙個小朋友的橡皮泥,於是她決定,在正式開始做泥塑前,讓大家把手裡的橡皮泥都捏成乙個立方體,並且測量手裡捏好的橡皮泥的長 寬和高。...