題目大意:
給乙個長度為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...