主席樹 HDU5919 CCPC2016長春

2021-10-24 16:56:43 字數 1525 閱讀 5311

題目大意:

給乙個長度為n的序列.給q次詢問,每次詢問[l,

r]

[l,r]

[l,r

].假設裡面有k

kk個不同的數.求從左到右第⌈k2

⌉\lceil\frac\rceil

⌈2k​

⌉個不同的數出現的位置.(n,q

≤2e5

n,q \leq 2e5

n,q≤2e

5題目思路:

前置知識點:主席樹求區間不同的數的個數:(個人認為知道這個點,這道題就做完80%了)

這裡需要求的是從左到右的位置.順序建樹行不通(因為我們只儲存乙個數最後出現的位置,與題目意思不相符合).

那麼自然想到逆序建樹,查詢[l,

r]

[l,r]

[l,r

]時,先查詢區間不同數個數.再直接對第l

ll顆樹查詢 第⌈k2

⌉\lceil\frac\rceil

⌈2k​

⌉個 貢獻1 出現的位置即可.(都是基操…)

一道銀牌題,還不錯.難度適中

ac**:

#include

using

namespace std;

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

const

int maxn =

4e5+5;

int sum[maxn <<5]

, ls[maxn <<5]

, rs[maxn <<5]

, rt[maxn]

, tot;

int add (

int l ,

int r ,

int t ,

int p ,

int c)

int ask_num (

int t ,

int l ,

int r ,

int l ,

int r)

int ask_pos (

int t ,

int l ,

int r ,

int k)

int last[maxn]

, a[maxn]

, n , m;

intmain()

int up = n <<5;

for(

int i =

0; i <= up ; i++

) rt[n +1]

=0;for

(int i =

1; i <= n ; i++

)for

(int i = n; i >=

1; i--

)else

last[a[i]

]= i;

}int lastans =0;

printf

("case #%d: "

,++ca)

;while

(m--)}

return0;

}

hdu5919 主席樹求區間不同數

題目大意 有長度為 n l r 這段區間中所有不同數出現的第乙個位置,按照位置從小到大排完序以後的中間 向上取整 的那個位置是多少?解題思路 把n個元素倒著插進主席樹中,把上次出現的同乙個值的元素的貢獻值 1,新的這個值的貢獻值 1,這樣就可以把這個元素最左側的位置的貢獻保留。查詢區間 l,r 時只...

HDU 5919主席樹區間不同數 區間第K大

hdu 5919 題意 n個數,m個詢問,每次詢問區間 l,r 設 l,r 內不同的數有k個,它們在該區間第乙個次出現的位置是p1,p2.pk p1 2k 回答p k 1 2.思路 主席樹查區間不同的數的個數這個就不說了,前面的部落格有提到過。問題就在於我們在知道k之後,找p k 1 2,難道需要在...

HDU4417(主席樹計數)

解題思路 如果說用排序,那麼複雜度就是o mnlogn 會超時。用主席樹的空間複雜度是o nlogn 時間複雜度是o max nlogn,mlogn 這道題稍微修改一下query函式即可。include include include include define n 100009 using na...