社区讨论

洛谷AC,poj上WA了是什么鬼?

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@mi6okjc3
此快照首次捕获于
2025/11/20 08:15
4 个月前
此快照最后确认于
2025/11/20 08:15
4 个月前
查看原帖
如题,附上代码。
CPP
#include<cstdio>
#include<algorithm>
using namespace std;
struct Seg{
	int val;
	Seg *ch[2];
	Seg(){
		ch[0]=ch[1]=NULL;
		val=0;
	}
	void maintain(){
		val=ch[0]->val+ch[1]->val;
		return;
	}
}*root[5010];
struct node{
	int val,idx;
	bool operator<(const node b)const{
		return val<b.val;
	}
}a[100010];
inline int rd(){
	register int x=0,y=1;
	char c;
	do{
		c=getchar();
		if(c=='-')
			y=-y;
	}while(c<'0'||c>'9');
	do{
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}while(c>='0'&&c<='9');
	return x;
}
inline void build(Seg *o,int l,int r){
	if(l==r)
		return;
	int mid=(l+r)>>1;
	o->ch[0]=new Seg();
	o->ch[1]=new Seg();
	build(o->ch[0],l,mid);
	build(o->ch[1],mid+1,r);
	return;
}
int n,m,c[100010],ans[100010];
inline void updata(Seg *o,int l,int r,int x){
	if(l==r){
		o->val=1;
		return;
	}
	int mid=(l+r)>>1,d=x>mid;
	Seg *p=o->ch[d];
	o->ch[d]=new Seg();
	*o->ch[d]=*p;
	if(d==1)
		updata(o->ch[1],mid+1,r,x);
	else updata(o->ch[0],l,mid,x);
	o->maintain();
	return;
}
inline int query(Seg *L,Seg *R,int l,int r,int x){
	if(l==r)
		return ans[l];
	int mid=(l+r)>>1,lval=R->ch[0]->val-L->ch[0]->val;
	if(x>lval)
		return query(L->ch[1],R->ch[1],mid+1,r,x-lval);
	return query(L->ch[0],R->ch[0],l,mid,x);
}
int main(){
	n=rd();
	m=rd();
	for(int i=1;i<=n;i++){
		a[i].val=rd();
		a[i].idx=i;
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		ans[i]=a[i].val;
		a[i].val=i;
	}
	for(int i=1;i<=n;i++)
		c[a[i].idx]=a[i].val;
	root[0]=new Seg();
	build(root[0],1,n);
	for(int i=1;i<=n;i++){
		root[i]=new Seg();
		*root[i]=*root[i-1];
		updata(root[i],1,n,c[i]);
	}
	for(int i=1;i<=m;i++){
		int l=rd(),r=rd(),k=rd();
		printf("%d\n",query(root[l-1],root[r],1,n,k));
	}
	return 0;
}

回复

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

正在加载回复...