社区讨论

主席树全WA求助

P3834【模板】可持久化线段树 2参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo1s2sax
此快照首次捕获于
2023/10/23 02:04
2 年前
此快照最后确认于
2023/11/03 02:41
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll int 
#define ri register int
const int N=2e5+5;

ll n,m,a[N],b[N],rt[N];

ll sum[N<<5],ls[N<<5],rs[N<<5],cnt=0; 

void bt(ll &p,ll l,ll r){
	p=++cnt;
	sum[p]=0;
	if(l==r) return;
	ll mid=l+r>>1; 
	bt(ls[p],l,mid);
	bt(rs[p],mid+1,r);
}

void insert(ll &p,ll pre,ll l,ll r,ll x){
	p=++cnt;
	ls[p]=ls[pre];rs[p]=rs[pre];sum[p]=sum[pre]+1;
	if(l==r) return;
	ll mid=l+r>>1;
	if(x<=mid) insert(ls[p],pre,l,mid,x);
	else insert(rs[p],pre,mid+1,r,x);
}

ll query(ll u,ll v,ll l,ll r,ll k){
	if(l==r) return l;//找到目标位置
	ll x=sum[ls[v]]-sum[ls[u]],mid=l+r>>1;
	if(x>=k) return  query(ls[u],ls[v],l,mid,k);//左子树比k大,答案在左子树 
	else return query(rs[u],rs[v],mid+1,r,k-x);//否则在右子树,减去左子树的排名 
}

int main(){
	std::ios::sync_with_stdio(false);
	cin>>n>>m;
	for(ri i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	} 
	sort(b+1,b+n+1);
	ll len=unique(b+1,b+n+1)-b-1;
	bt(rt[0],1,len);
	for(ri i=1;i<=n;i++){
		ll t=lower_bound(b+1,b+len+1,a[i])-b;
		insert(rt[i],rt[i-1],1,len,t);
	}
	while(m--){
		ll l,r,k;
		cin>>l>>r>>k;
		ll t=query(rt[l-1],rt[r],1,len,k);
		cout<<b[t]<<endl;
	}
}
https://www.luogu.com.cn/record/121756190

回复

1 条回复,欢迎继续交流。

正在加载回复...