您需要寫一種資料結構(可參考題目標題),來維護乙個有序數列,其中需要提供以下操作:
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 二逼平衡樹
您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 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 二逼平衡樹
題目鏈結 平衡樹系列最後一題 坑啊10s時間限制跑了9764ms。還是要學一學bit套主席樹啦。經典的線段樹套treap。至於第一發為什麼要tle 我不會告訴你treap插入的時候忘了旋轉 woc 自認為treap寫的挺好看的 歡迎來噴 1 include2 include3 include4 in...