1 条题解

  • 1
    @ 2022-5-21 12:18:17

    此题指针写法可以通过!!!

    主要是非叶结点上不维护信息,只开两个指针即可。

    #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

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

    信息

    ID
    2852
    时间
    1500ms
    内存
    1024MiB
    难度
    5
    标签
    递交数
    20
    已通过
    8
    上传者