权值线段树

线段树这种数据结构一般用于区间操作的题目之中,比如区间修改或者区间查询,但当我们想要针对值的数量等信息时,就会用到权值线段树,其本质就是建立在上的线段树。

其代码和普通线段树没有什么区别,但其功能有些不同:

1.查询某个元素的排名:

#define ls id<<1
#define rs id<<1|1
int query_id(int id,int l,int r,int x){
	if(l==r)return 1;
	int mid=(l+r)>>1;
	if(x<=mid)return query_id(ls,l,mid,x);
	else return t[ls]+query_id(rs,mid+1,r,x);
}

2.查询排名第 \(k\) 个元素的值

#define ls id<<1
#define rs id<<1|1
int query_nm(int id,int l,int r,int x){
	if(l==r)return f[l];
	int mid=(l+r)>>1;
	if(x<=t[ls])return query_nm(ls,l,mid,x);
	else return query_nm(rs,mid+1,r,x-t[ls]);
}

其他的都和普通线段树一样

posted @ 2024-12-02 20:14  WDY_Hodur  阅读(61)  评论(0)    收藏  举报