关于主席树常数
  • 板块学术版
  • 楼主Bamboo_Day
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/11/15 20:50
  • 上次更新2023/11/15 22:06:49
查看原帖
关于主席树常数
482452
Bamboo_Day楼主2023/11/15 20:50

RT
不太懂为什么我主席树的常数是别人的两倍左右

这是我的写法

struct Node{
	int l,r,sum;
}tr[N*40];
#define ls(pos) tr[pos].l
#define rs(pos) tr[pos].r
#define sum(pos) tr[pos].sum
int rt[N];
int tot = 0;
void push_up(int pos){
	sum(pos) = sum(ls(pos)) + sum(rs(pos));
}
void build(int last, int &now, int l, int r,int x){
	now = ++tot;
	ls(now) = ls(last);
	rs(now) = rs(last);
	sum(now) = sum(last);
	if(l == r){
		sum(now)++;
		return;
	}
	int mid = (l+r)>>1;
	if(x <= mid){
		build(ls(last),ls(now),l,mid,x);
	}else{
		build(rs(last),rs(now),mid+1,r,x);
	}
	push_up(now);
} 
int kth(int L, int R, int l, int r,int k){
	if(l == r){
		return l;
	}
	int mid = (l+r)>>1;
	if(sum(ls(R)) - sum(ls(L)) < k) return kth(rs(L),rs(R),mid+1,r,k-(sum(ls(R)) - sum(ls(L))));
	else return kth(ls(L),ls(R),l,mid,k);
}
int query(int L, int R, int l, int r,int x){
	if(l == r){
		return sum(R) - sum(L);
	}
	int mid = (l+r)>>1;
	if(x <= mid) return query(ls(L),ls(R),l,mid,x);
	else return query(rs(L),rs(R),mid+1,r,x);
}
2023/11/15 20:50
加载中...