hdu - 5919
題意:n個數,m個詢問,每次詢問區間[l,r],設[l,r]內不同的數有k個,它們在該區間第乙個次出現的位置是p1,p2...pk(p1
2k),回答p(k+1)/2.
思路:主席樹查區間不同的數的個數這個就不說了,前面的部落格有提到過。問題就在於我們在知道k之後,找p(k+1)/2,難道需要在重新建一棵以權值線段樹建的主席樹,或者二分去找?
其實並不用,在前面部落格查區間不同的數的時候我們是從左往右建的,這樣的話,主席樹中,相同的數都是儲存在當前出現過的最右位置。那反過來,從右往左建的話,相同的數就是儲存在當前出現過的最左位置,然後再在這方面找第(k+1)/2大的數即可。
#includeusing主席樹下主席果namespace
std;
const
int n=1e6+11
;struct
treet[n*32
];int
tn,a[n],root[n],vis[n];
int build(int l,int
r)int addt(int x,int l,int r,int p,int
val)
int query(int x,int l,int r,int
qr)int findk(int x,int l,int r,int
k) int
main()
tn=0
; root[n+1]=build(1
,n);
for(int i=n;i>=0;i--)
int l,r,ans=0
; printf(
"case #%d:
",t++);
while(m--)
printf("\n
");}
return0;
}
hdu5919 主席樹求區間不同數
題目大意 有長度為 n l r 這段區間中所有不同數出現的第乙個位置,按照位置從小到大排完序以後的中間 向上取整 的那個位置是多少?解題思路 把n個元素倒著插進主席樹中,把上次出現的同乙個值的元素的貢獻值 1,新的這個值的貢獻值 1,這樣就可以把這個元素最左側的位置的貢獻保留。查詢區間 l,r 時只...
主席樹 HDU5919 CCPC2016長春
題目大意 給乙個長度為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題目思路 前置知識點 主席樹求區間不同的數的個數 個人...
SPOJ DQUERY (主席樹求區間不同數個數)
題意 找n個數中無修改的區間不同數個數 我們需要這麼想 從左向右新增一到主席樹上,新增的是該數字處在的位置 但是如果該數字前面出現過,就在此版本的主席樹上的前面出現的位置減一,接著才在此位置上添一 這樣查詢是按照右區間版本的主席樹來找 lef,rig 的數字 因為要將此區間每個不同的數都處在最後出現...