3196 Tyvj 1730 二逼平衡樹

2021-07-02 07:31:19 字數 2203 閱讀 7459

分析:

帶區間查詢和名次詢問,線段樹套treap

操作1: 查詢k在區間內的排名。

求出k-1的名次+1就是k的名次

操作2:查詢區間內排名為k的值。

二分列舉權值,呼叫操作1

操作3:修改某一位值上的數值。

在樹上先刪除,再插入

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

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

在treap樹上遍歷

//83516 kb  6160 ms c++/edit

#include

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

const

int maxn=50010;

const

int n=3000000;

const

int inf=1e8;

using

namespace

std;

int n,q;

int a[maxn];

struct node;

node s[n];

node*ptr=s;

node* null=ptr;

struct treap

void newnode(node* &rt,int x)

void init()

void rotate(node* &rt,int d)

void insert(node* &rt,int x)

int d=x<=rt->v?0:1;

if(rt->v==x)else

push_up(rt);

}void remove(node* &rt,int x)

elseelse

}}else

if(rt!=null) push_up(rt);

}void modify(node* &rt,int x,int v)

int findk(node* rt,int k)

int rank(node* rt,int x)

}return s;

}int before(node *rt,int x)else res=max(res,before(rt->ch[0],x));

return res;

}int after(node* rt,int x)

else res=min(res,after(rt->ch[1],x));

return res;

}void view(node* rt)

};treap seg[n];

void init()

void update(int p,int x,int v,int l,int r,int rt)

int query1(int l,int r,int v,int l,int r,int rt)

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

int res=0;

if(l<=m) res+=query1(l,r,v,lson);

if(mreturn res;

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

else r=mid-1;

}return ans;

}int query4(int l,int r,int k,int l,int r,int rt)

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

int res=0;

if(l<=m) res=max(res,query4(l,r,k,lson));

if(mreturn res;

}int query5(int l,int r,int k,int l,int r,int rt)

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

int res=inf;

if(l<=m) res=min(res,query5(l,r,k,lson));

if(mreturn res;

}void view(int l,int r,int rt)

int main()

while(q--)

if(op==2)

if(op==3)

if(op==4)

if(op==5)}}

return

0;}

3196 Tyvj 1730 二逼平衡樹

time limit 10 sec memory limit 128 mb submit 2771 solved 1121 submit status discuss 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值...

3196 Tyvj 1730 二逼平衡樹

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

BZOJ3196 Tyvj 1730 二逼平衡樹

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