因为本人过菜,所以不会语法。
这是第一份代码(主席树)样例全部输出 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 的值在同一个函数内会改变吗?