3065 帶插入區間K小值 樹套樹 替罪羊樹

2021-09-05 09:53:55 字數 2153 閱讀 9367

經過週六一天,周一3個小時的晚自習,周二2個小時的瘋狂debug,終於憑藉自己切掉了這道樹套樹題.

code:

#include #include #include #include #include #include // 帶插入區間 k 小值

// 外層:替罪羊

// 內層:權值線段樹

using namespace std;

#define setio(s) freopen(s".in","r",stdin), freopen(s".out","w",stdout)

#define debug() printf("ok\n")

#define maxn 11005000

#define n 70002

int n,lastans;

struct segment_tree

}node[maxn];

queueq;

void init()

void dfs(int &o)

}segin;

struct binary_search_tree

int cnt,root;

int seq[n],count[3];

vectorre;

struct node

}node[maxn];

inline void newnode(int &o,int val)

void dfs(int &o)

void construct(int l,int r,int &o)

construct(l,mid-1,node[o].ls), construct(mid+1,r,node[o].rs);

node[o].siz=node[node[o].ls].siz+node[node[o].rs].siz+1;

}inline void rebuild(int &o)

void insert(int &o,int k,int val,bool is)

++node[o].siz, segin.update(0,n,node[o].root,val,1);

bool tag;

if(k<=node[node[o].ls].siz+1) tag=check(node[node[o].ls].siz+1,node[o].siz), insert(node[o].ls,k,val,is||tag);

else tag=check(node[node[o].rs].siz+1,node[o].siz), insert(node[o].rs,k-node[node[o].ls].siz-1,val,is||tag);

if(!is&&tag) rebuild(o);

}int modify(int o,int pos,int delta)

if(pos<=node[node[o].ls].siz) num=modify(node[o].ls,pos,delta);

else num=modify(node[o].rs,pos-node[node[o].ls].siz-1,delta);

segin.update(0,n,node[o].root,num,-1),segin.update(0,n,node[o].root,delta,1);

return num;

}void build()

void get(int l,int r,int o,int l,int r)

int mid=node[node[o].ls].siz+l;

if(mid>=l&&mid<=r&&mid<=r) seq[++count[0]]=node[o].cur;

get(l,mid-1,node[o].ls,l,r),get(mid+1,r,node[o].rs,l,r);

}int solve(int l,int r,int k)

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

if(k>lsum)

else

}void insert()

void modify()

int query()

}bst;

int main()

return 0;

}

bzoj3065帶插入區間K小值

這題其實好像很難,但是聽werkeytom ftd說可以用塊鏈水,於是就很開心地去打了個塊狀鍊錶套主席樹,插入操作就直接插到乙個塊中,注意如果塊的大小2 block就將塊分開,注意每乙個修改或插入都要修改後繼的狀態,貼 include include include include include ...

BZOJ3065 帶插入區間K小值

因為需要支援插入,所以外層需要乙個平衡樹,替罪羊樹比較好寫 內層需要帶修改,求k小值,可以使用權值線段樹維護平衡樹每個節點子樹內的所有權值,求k小值時二分查詢 所以是平衡樹套權值線段樹 include include include include include using namespace s...

BZOJ 3065 帶插入區間K小值

思路 做法比較多,我寫的是權值線段樹套平衡樹,平衡樹內維護該權值區間內各元素位置,每次查詢從線段樹根結點開始左右走就可以了。現在問題是如何解決帶插入的情況下快速比較兩個位置標號的前後關係,我們可以用替罪羊樹維護,我們給每個位置標號定個rank區間,例如根定為 0,1e18 定其rank值為中點5 1...