神奇RE,MnZn求调

P3919 【模板】可持久化线段树 1(可持久化数组)

大佬好强啊
by Programming_Konjac @ 2024-03-23 10:17:24


找到了,~~难以启齿的错~~
by cmrhhh @ 2024-03-23 12:22:48


AC代码,~~马蜂还行~~ ```cpp #include<iostream> using namespace std; const int MAXN=3.5e7+10; int n,m,a[MAXN],vi,loci,opi,vali; int tree_tot=0,root[MAXN];//root[i]为i版本的根编号,刚开始编号为0 struct Tree{ int l,r,val; }tree[MAXN<<2]; int cpy(int id){ tree[++tree_tot]=tree[id]; return tree_tot; } int build(int id,int l,int r){ id=++tree_tot; if(l==r){ tree[id].val=a[l]; return id; } int mid=l+r>>1; tree[id].l=build(0,l,mid); tree[id].r=build(0,mid+1,r); return id; } int update(int id,int l,int r,int loc,int val){ id=cpy(id); if(l==r)tree[id].val=val; else { int mid=l+r>>1; if(mid>=loc)tree[id].l=update(tree[id].l,l,mid,loc,val);//等号记得带上 if(mid<loc) tree[id].r=update(tree[id].r,mid+1,r,loc,val);//左右儿子可能会改变 } return id; } int query(int id,int l,int r,int loc){ if(l==r)return tree[id].val; int mid=l+r>>1; if(mid>=loc) return query(tree[id].l,l,mid,loc); else return query(tree[id].r,mid+1,r,loc); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i)scanf("%d",&a[i]); root[0]=1;build(0,1,n); for(int i=1;i<=m;++i){ scanf("%d%d%d",&vi,&opi,&loci); if(opi==1){ scanf("%d",&vali); root[i]=update(root[vi],1,n,loci,vali); } if(opi==2){ printf("%d\n",query(root[vi],1,n,loci)); root[i]=root[vi]; } } return 0; } ``` 此帖结
by cmrhhh @ 2024-03-23 12:47:52


|