1 条题解
-
1
此题指针写法可以通过!!!
主要是非叶结点上不维护信息,只开两个指针即可。
#include <bits/stdc++.h> using namespace std; inline int read() { char c;int f{1}; while (!isdigit(c=getchar())) if (c=='-') f=-f; int x{c^48}; while (isdigit(c=getchar())) x=(x<<3)+(x<<1)+(c^48); return x*f; } // 非叶节点 struct tnode { tnode *l,*r; }; // 叶节点:其实不用开两个指针,但为了方便多态只能继承了 struct lnode:public tnode { int val; lnode(int c=0):val{c}{} }; using pnode=tnode*; // 块状内存优化 pnode new_tnode() { static pnode t,p; const static size_t N{1000000}; if (t==nullptr||p-t>=N) p=t=new tnode[N]; return p++; } const int N(1e6); pnode ver[N+5]; pnode build(int cnt) { if (cnt==1) return new lnode{read()}; pnode p=new_tnode(); p->l=build(cnt>>1); p->r=build(cnt-(cnt>>1)); return p; } pnode modify(pnode p,int k,int x,int cnt) { if (cnt==1) return new lnode{x}; pnode q{new_tnode()}; q->l=p->l;q->r=p->r; if (k<=cnt>>1) q->l=modify(p->l,k,x,cnt>>1); else q->r=modify(p->r,k-(cnt>>1),x,cnt-(cnt>>1)); return q; } int query(pnode p,int k,int cnt) { if (cnt==1) return ((lnode*)p)->val; if (k<=cnt>>1) return query(p->l,k,cnt>>1); else return query(p->r,k-(cnt>>1),cnt-(cnt>>1)); } int main() { int n,m;cin>>n>>m; ver[0]=build(n); for (int i{1};i<=m;++i) { int ve,op,p,v; scanf("%d %d",&ve,&op); switch (op) { case 1: scanf("%d %d",&p,&v); ver[i]=modify(ver[ve],p,v,n); break; case 2: scanf("%d",&p); printf("%d\n",query(ver[i]=ver[ve],p,n)); break; default: cout<<"I AK IOI"<<endl; } } return 0; }
- 1
信息
- ID
- 2852
- 时间
- 1500ms
- 内存
- 1024MiB
- 难度
- 5
- 标签
- 递交数
- 20
- 已通过
- 8
- 上传者