hdu 6621 主席樹 二分

2022-08-17 14:30:22 字數 1116 閱讀 1020

題意:給乙個陣列a,每次詢問,給定l, r, p, k,求[ l , r ] 中的數與p做差的絕對值的第k小。

思路:對陣列a建立主席樹(不用離散化),對於每次詢問,二分答案,如果 [ l , r ] 區間中的 [ p - mid , p + mid ] 範圍內的數大於k,則說明二分的答案偏大,需要縮小區間;如果等於k,也需要縮小,因為要找到精確的值;小於k則需要放大區間。(可以畫數軸理解)

**:

1 #include2

using

namespace

std;

3const

int maxn=1e5+10;4

const

int n=1e6;

5struct

nodetree[maxn*22];8

introot[n];

9int

tot;

10int

n,m;

11void update(int &p,int x,int l,int r,int

rt)20

int query(int u,int v,int x,int y,int l,int

r)24

int ans=0;25

int mid=(l+r)>>1;26

if(x<=mid) ans+=query(tree[u].l,tree[v].l,x,y,l,mid);

27if(y>mid) ans+=query(tree[u].r,tree[v].r,x,y,mid+1

,r);

28return

ans;29}

30int solve(int l,int r,int x,int

y)35

intmain()

3647

int ans=0;48

for(int i=1;i<=m;i++)

59 ans=l;

60 printf("

%d\n

",ans);61}

62}63return0;

64 }

HDU 6621 主席樹 二分優化

這本來應該是多校的時候用來救命的一道資料結構水題,結果當時不知道是測評機有問題還是我 不夠簡單,15s都tle了,當時很慌,也沒細想,後來重寫了一遍,6s不到過了。題意很好理解,乙個陣列,我問你某一子區間內所有數和p pp的差值裡,第k kk小的是多少?首先,這題主席樹基本不難想,要是不會主席樹可以...

hdu 6621(主席樹模板)

hdu 6621 思路 每次查詢第k小,只有p在改變,所以我們可以列舉p的左右範圍,因為題目中保證每個值都不同,所以省略離散化,直接建立主席樹,二分尋找p的左右範圍,就是最終的答案。include using namespace std const int maxn 1e6 10 int a max...

bzoj2653 二分 主席樹

對於每乙個詢問二分答案。設當前答案為x,將 x的數的權值設為1,當 b 1,c 1 的權值和 a,b 權值和最大的字尾 c,d 權值和最大的字首 0時x可行。先對每個數離散,然後以每個值建立主席樹記錄區間和 最大字首 最大字尾就可以了。時間複雜度 o n log3n 1 include2 inclu...