社区讨论

求助关于线段树建树

学术版参与者 2已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@loclup00
此快照首次捕获于
2023/10/30 15:55
2 年前
此快照最后确认于
2023/11/05 03:03
2 年前
查看原帖
RT,在写可持久化线段树,结果连建树都不会了……
不知道为啥REQAQ(build)
CPP
#include <stdio.h>
#include <string.h> 
inline int read()
{
	int num=0,f=1;char c=getchar();
	while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
	while(c>47&&c<58)num=num*10+(c^48),c=getchar();
	return num*f;
}
int a[4000005];
struct Node{
public:
	Node *lc,*rc;
	int x;
	Node()
	{
		lc=rc=NULL;
		x=0;
	}
};
Node* p[100005];
void build(Node *o,int l,int r)
{
	printf("%d %d\n",l,r);
	if(l==r)
	{
		o->x=a[l];
		o->lc=o->rc=NULL;
		return;
	}
	o->lc=new Node();//这里赋值的时候炸了
	o->rc=new Node();//这里赋值的时候炸了
	int m=l+r>>1; 
	build(o->lc,l,m);
	build(o->rc,m+1,r);
}
void add(Node* o,int l,int r,int pos,int x,Node *q)
{
	if(l==r)
	{
		o->x=x;
		o->lc=o->rc=NULL;
		return;
	}
	int m=l+r>>1;
	if(pos<=m)
	{
		add(o->lc,l,m,pos,x,q->lc);
		o->rc=q->rc;
	}
	else
	{
		add(o->rc,m+1,r,pos,x,q->rc);
		o->lc=q->lc;
	}
}
int query(Node *o,int l,int r,int pos)
{
	if(l==r)return o->x;
	int m=l+r>>1;
	return pos<=m?query(o->lc,l,m,pos):query(o->rc,m+1,r,pos);
}
int main()
{
	int n=read(),T=read();
	int m=1;while(m<n)m<<=1;
	for(int i=1;i<=n;i++)a[i]=read();
	build(p[0],1,m);
	for(int i=1;i<=T;i++)
	{
		int v=read(),op=read(),loc=read();
		if(op==1)
		{
			int val=read();
			add(p[i],1,m,loc,val,p[v]);
		}
		else
		{
			printf("%d\n",query(p[v],1,m,loc));
			p[i]=p[v];
		}
	}
}

回复

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

正在加载回复...