hdu 6621(主席樹模板)

2021-09-25 18:34:49 字數 796 閱讀 5559

hdu 6621

思路:每次查詢第k小,只有p在改變,所以我們可以列舉p的左右範圍,因為題目中保證每個值都不同,

所以省略離散化,直接建立主席樹,二分尋找p的左右範圍,就是最終的答案。

#include using namespace std;

const int maxn = 1e6+10;

int a[maxn],n,m,cnt,root[maxn];

struct node

tree[maxn*40];

vector vc;

int getid(int x)

void build(int &rt,int l,int r)

void update(int num,int &rt,int lt,int l,int r)

int query(int i,int j,int k1,int k2,int l,int r)

int mid = (l+r)>>1,ans = 0;

if(k1<=mid) ans += query(tree[i].l,tree[j].l,k1,k2,l,mid);

if(k2>mid) ans += query(tree[i].r,tree[j].r,k1,k2,mid+1,r);

return ans;

}int main(void)

int ans = 0;

while(m--)

else

}printf("%d\n",ans);}}

return 0;

}

hdu 6621 主席樹 二分

題意 給乙個陣列a,每次詢問,給定l,r,p,k,求 l r 中的數與p做差的絕對值的第k小。思路 對陣列a建立主席樹 不用離散化 對於每次詢問,二分答案,如果 l r 區間中的 p mid p mid 範圍內的數大於k,則說明二分的答案偏大,需要縮小區間 如果等於k,也需要縮小,因為要找到精確的值...

HDU 6621 主席樹 二分優化

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

hdu2665(主席樹模板題)

求區間第 k 小。參考這類題目做法挺多的,例如 劃分樹。這裡使用主席樹再寫一發,不得不說主席樹相比而言要好寫的多,比起普通線段樹,主席樹就是復用了線段樹共有的資訊。可持久化資料結構講究的就是復用共有的資訊,可持久化 trie 的思想也是差不多的。includeusing namespace std ...