Bzoj3196 二逼平衡樹

2021-08-09 08:54:44 字數 1738 閱讀 3756

您需要寫一種資料結構(可參考題目標題),來維護乙個有序數列,其中需要提供以下操作:

1.查詢k在區間內的排名

2.查詢區間內排名為k的值

3.修改某一位值上的數值

4.查詢k在區間內的前驅(前驅定義為小於x,且最大的數)

5.查詢k在區間內的後繼(後繼定義為大於x,且最小的數)

額,這個題,看了一眼就知道是線段樹套線段樹啦,所以隨手糊一發

#pragma gcc opitmize("o3")

#pragma g++ opitmize("o3")

#include

#include

#include

#define n 50010

#define gr 0,10000000,c[x].rt

using

namespace

std;

int t=0,n,m,v[50010];

struct dn } s[11000010];

struct segment

void insert(int l,int r,int& x,int k)

int m=l+r>>1;++s[x].s;

if(k<=m) insert(l,m,s[x].l,k);

else insert(m+1,r,s[x].r,k);

} void remove(int l,int r,int& x,int k)

int m=l+r>>1; --s[x].s;

if(k<=m) remove(l,m,s[x].l,k);

else remove(m+1,r,s[x].r,k);

} int gmax(int l,int r,int x)

int gmin(int l,int r,int x)

int grank(int l,int r,int x,int k)

int gpre(int l,int r,int x,int k)

} int gsuc(int l,int r,int x,int k)

}} c[200010];

void modify(int l,int r,int x,int p,int k)

int getrank(int l,int r,int x,int l,int r,int k)

int getpre(int l,int r,int x,int l,int r,int k)

int m=l+r>>1,s=-1

<<30;

if(l<=m) s=max(s,getpre(l,m,x<<1,l,r,k));

if(m1,r,x<<1|1,l,r,k));

return s;

}int getsuc(int l,int r,int x,int l,int r,int k)

int m=l+r>>1,s=1

<<30;

if(l<=m) s=min(s,getsuc(l,m,x<<1,l,r,k));

if(m1,r,x<<1|1,l,r,k));

return s;

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

return l;

}void build(int l,int r,int x)

int main()

}

無比優美,結果re了,跑到tyvj上面搞個資料發現空間被卡了。。。。

正解是線段樹套(treap,splay,替罪羊。。。)

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,且最小的數 額,這個題,看了一眼就知道是...

bzoj3196 二逼平衡樹

題目鏈結 平衡樹系列最後一題 坑啊10s時間限制跑了9764ms。還是要學一學bit套主席樹啦。經典的線段樹套treap。至於第一發為什麼要tle 我不會告訴你treap插入的時候忘了旋轉 woc 自認為treap寫的挺好看的 歡迎來噴 1 include2 include3 include4 in...