社区讨论

主席树晕氧RE求调

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo26dt6v
此快照首次捕获于
2023/10/23 08:44
2 年前
此快照最后确认于
2023/11/03 09:00
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+10;

#define int long long

int a[maxn];
int root[maxn],lv,h[maxn],raw[maxn],rh[maxn];

struct PersisitentArray {
	struct Node {
		int l,r,val,sum;
		Node operator=(const Node b) {
			l=b.l,r=b.r,val=b.val;
			return *this;
		}
	} v[maxn<<5];
	int psz=1;
	int clone(int r) {
		v[++psz]=v[r];
		return psz;
	}
	int pushup(int u) {
		v[u].sum=v[v[u].l].sum+v[v[u].r].sum;
	}
	void build(int u,int l,int r) {
		if(l==r) {
			return;
		}
		int mid=l+r>>1;
		v[u].l=clone(0),v[u].r=clone(0);
		build(v[u].l,l,mid),build(v[u].r,mid+1,r);
		pushup(u);
	}
	int add(int u,int l,int r,int x) {
		u=clone(u);
		if(l==r) {
			v[u].val+=1;
			v[u].sum+=1;
			return u;
		}
		int mid=l+r>>1;
		if(x<=mid) v[u].l=add(v[u].l,l,mid,x);
		else v[u].r=add(v[u].r,mid+1,r,x);
		pushup(u);
		return u;
	}
	
	int query(int u,int l,int r,int x) {
		if(l==r) return v[u].val;
		int mid=l+r>>1;
		if(x<=mid) return query(v[u].l,l,mid,x);
		else return query(v[u].r,mid+1,r,x);
	}
	
	int Mquery(int ul,int ur,int l,int r,int k) {
		if(l==r) return raw[l];
		int mid=l+r>>1;
		int sl=v[v[ur].l].sum-v[v[ul].l].sum;
		if (sl<=k)
			return Mquery(v[ul].r,v[ur].r,mid+1,r,k-sl);
		else
			return Mquery(v[ul].l,v[ur].l,l,mid,k);
	}
		
}pst;
int debug_v;
signed main() {
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i],raw[i]=a[i];
	sort(raw+1,raw+1+n);
	int tn=unique(raw+1,raw+1+n)-raw-1;
	for(int i=1;i<=n;i++) h[i]=upper_bound(raw+1,raw+1+tn,a[i]-1)-raw;
	for(int i=1;i<=n;i++) rh[h[i]]=a[i];

	pst.build(root[0]=1,1,tn);
	
	for(int i=1;i<=n;i++) root[i]=pst.add(root[i-1],1,tn,h[i]);
	while(m--) {
		int l,r,k;
		cin>>l>>r>>k;
		cout<<pst.Mquery(root[l-1],root[r],1,tn,k-1)<<'\n';
	}
}
rt,手搓几个本地没问题,样例已过,你谷全部RE

回复

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

正在加载回复...