不懂就问
  • 板块学术版
  • 楼主CYZZ
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/1/16 18:18
  • 上次更新2024/1/16 21:16:32
查看原帖
不懂就问
631576
CYZZ楼主2024/1/16 18:18

因为本人过菜,所以不会语法。

这是第一份代码(主席树)样例全部输出 0

#include <bits/stdc++.h>
using namespace std;
#define N 1000005
#define mid (l+r>>1)
int n,m,a[N];
int idx,rt[N];
struct Seg_Tree
{
	int ls,rs,val;
}tr[N*20];
int build(int l,int r)
{
	idx++;
	if(l==r) {tr[idx].val=a[l];return idx;};
	tr[idx].ls=build(l,mid);
	tr[idx].rs=build(mid+1,r);
	return idx;
}
int update(int p,int l,int r,int pos,int add)
{
	tr[++idx]=tr[p];
	if(l==r) {tr[idx].val=add;return idx;}
	if(pos<=mid) tr[idx].ls=update(tr[p].ls,l,mid,pos,add);
	else tr[idx].rs=update(tr[p].rs,mid+1,r,pos,add);
	return idx;
}
int query(int p,int l,int r,int pos)
{
	if(l==r) return tr[p].val;
	if(pos<=mid) return query(tr[p].ls,l,mid,pos);
	return query(tr[p].rs,mid+1,r,pos);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	rt[0]=build(1,n);
	for(int i=1;i<=m;i++)
	{
		int ope,lst,x,y;
		scanf("%d%d",&lst,&ope);
		if(ope==1)
		{
			scanf("%d%d",&x,&y);
			rt[i]=update(rt[lst],1,n,x,y);
		}
		else
		{
			scanf("%d",&x);
			printf("%d\n",query(rt[lst],1,n,x));
			rt[i]=rt[lst];
		}
	}
}

这是第二份代码,只把每一个调用 idx 的地方用一个额外的变量储存,这份是对的。

#include <bits/stdc++.h>
using namespace std;
#define N 1000005
#define mid (l+r>>1)
int n,m,a[N];
int cnt,rt[N];
struct Seg_Tree
{
	int ls,rs,val;
}tr[N*25];
int build(int l,int r)
{
	int idx=++cnt;
	if(l==r) {tr[idx].val=a[l];return idx;};
	tr[idx].ls=build(l,mid);
	tr[idx].rs=build(mid+1,r);
	return idx;
}
int update(int p,int l,int r,int pos,int add)
{
	int idx=++cnt;
	tr[idx]=tr[p];
	if(l==r) {tr[idx].val=add;return idx;}
	if(pos<=mid) tr[idx].ls=update(tr[p].ls,l,mid,pos,add);
	else tr[idx].rs=update(tr[p].rs,mid+1,r,pos,add);
	return idx;
}
int query(int p,int l,int r,int pos)
{
	if(l==r) return tr[p].val;
	if(pos<=mid) return query(tr[p].ls,l,mid,pos);
	return query(tr[p].rs,mid+1,r,pos);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	rt[0]=build(1,n);
	for(int i=1;i<=m;i++)
	{
		int ope,lst,x,y;
		scanf("%d%d",&lst,&ope);
		if(ope==1)
		{
			scanf("%d%d",&x,&y);
			rt[i]=update(rt[lst],1,n,x,y);
		}
		else
		{
			scanf("%d",&x);
			printf("%d\n",query(rt[lst],1,n,x));
			rt[i]=rt[lst];
		}
	}
}

想知道为什么,难道 idx 的值在同一个函数内会改变吗?

2024/1/16 18:18
加载中...