題目大意:有長度為
n [l
,r]
這段區間中所有不同數出現的第乙個位置,按照位置從小到大排完序以後的中間(向上取整)的那個位置是多少?
解題思路:把n個元素倒著插進主席樹中,把上次出現的同乙個值的元素的貢獻值-1,新的這個值的貢獻值+1,這樣就可以把這個元素最左側的位置的貢獻保留。查詢區間[l,r]時只要查詢第l個版本的主席樹就好了。
ps:前一篇部落格由於記錄的是字首,所以不能在主席樹上進行類似二分的跳躍。
#include using namespace std;
#define maxn 210000
int treesiz,sum[maxn*40],num,pre[maxn];
int ls[maxn*40],rs[maxn*40],root[maxn],n,m,seq[maxn];
void update(int l,int r,int x,int &y,int pos,int f)
ls[y]=ls[x];rs[y]=rs[x];
int mid=(l+r)>>1;
if(pos<=mid) update(l,mid,ls[x],ls[y],pos,f);
else update(mid+1,r,rs[x],rs[y],pos,f);
}int query(int l,int r,int rt,int x,int y)
int solve(int l,int r,int rt,int num)
void cn()
int main()
for(int i=n;i;i--)
else
pre[seq[i]]=i;
}int l,r,ans=0;
printf("case #%d:",ii);
for(int i=1;i<=m;i++)
printf("\n");
}return 0;}/*
25 2
3 3 1 5 4
2 24 4
5 22 5 2 1 2
2 32 4
15 2
2 5 2 1 2
2 32 4
*/
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,難道需要在...
SPOJ DQUERY (主席樹求區間不同數個數)
題意 找n個數中無修改的區間不同數個數 我們需要這麼想 從左向右新增一到主席樹上,新增的是該數字處在的位置 但是如果該數字前面出現過,就在此版本的主席樹上的前面出現的位置減一,接著才在此位置上添一 這樣查詢是按照右區間版本的主席樹來找 lef,rig 的數字 因為要將此區間每個不同的數都處在最後出現...
主席樹 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題目思路 前置知識點 主席樹求區間不同的數的個數 個人...