BZOJ3196 二逼平衡樹

2022-05-12 15:06:22 字數 1361 閱讀 6562

**樹狀陣列與線段樹:

**\(splay\):

題目傳送門:

樹套樹模板題,外層用乙個位置線段樹,內層用乙個平衡樹即可解決。

查第\(k\)大是誰需要在外面套乙個二分。這題比較卡,反正我是勉勉強強跑過去的……

時間複雜度:\(o(nlog^3n)\)

空間複雜度:\(o(nlogn)\)

**如下:

#include #include using namespace std;

const int maxn=5e4+5,inf=2147483647;

int a[maxn];

int n,m,mn=1e9,mx=-1e9;

int read()

struct splay

int find(int rt,int v)

if(val[u]val[u]]=tot;splay(rt,tot);

}int get_rk(int &rt,int v)

void del(int &rt,int v)

if(!son[u][0])

if(!son[u][1])

int node=son[u][0];while(son[node][1])node=son[node][1];

fa[son[u][0]]=0;splay(rt,node);

son[node][1]=son[u][1];fa[son[u][1]]=node;

updata(node);

}int get_pre(int &rt,int v)

}s;struct segment_tree

int query_rk(int p,int l,int r,int l,int r,int v)

void change(int p,int l,int r,int pos,int v_before,int v_after)

int query_pre(int p,int l,int r,int l,int r,int v)

int query_suc(int p,int l,int r,int l,int r,int v)

}t;int main()

printf("%d\n",l);

}if(opt==3)t.change(1,1,n,pos,a[pos],k),a[pos]=k,mn=min(mn,k),mx=max(mx,k);

if(opt==4)printf("%d\n",t.query_pre(1,1,n,l,r,k));

if(opt==5)printf("%d\n",t.query_suc(1,1,n,l,r,k));

}return 0;

}

Bzoj3196 二逼平衡樹

您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x,且最小的數 額,這個題,看了一眼就知道是...

BZOJ3196 二逼平衡樹

因為線段樹支援區間修改查詢,平衡樹支援查詢第k大,乙個數的排名,乙個數的前驅 後繼。所以選擇兩個資料結構套在一起。include include include using namespace std int n,m,sz,tmp int a 200005 root 200005 struct tr...

Bzoj3196 二逼平衡樹

您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x,且最小的數 額,這個題,看了一眼就知道是...