其他分享
首页 > 其他分享> > 洛谷P3919 【模板】可持久化线段树 1(可持久化数组)

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

作者:互联网

 

模板~昨天打组队被ds和计算几何卡了

今天是学习它们的day1(该不会每一天都是day1吧

存个模板.jpg

tips.主席树空间大概开30比较稳,然后爆了的话试试25左右

#include<bits/stdc++.h>
using namespace std;
const int N=int(1e6)+6;
int rt[N*30],a[N];
struct persis_seg_tree{
    int lc[N*30],rc[N*30],val[N*30],cnt;
    inline void build(int &o,int l,int r){
        o=++cnt;
        if(l==r) {val[o]=a[l];return;}
        int mid=(l+r)>>1;
        build(lc[o],l,mid);build(rc[o],mid+1,r); 
    }
    inline void ins(int &o,int pre,int l,int r,int x,int v){
        o=++cnt;
        lc[o]=lc[pre];rc[o]=rc[pre];val[o]=val[pre];
        if(l==r) {val[o]=v;return;}
        int mid=(l+r)>>1;
        if(x<=mid) ins(lc[o],lc[pre],l,mid,x,v);
        else ins(rc[o],rc[pre],mid+1,r,x,v);
    }
    inline int query(int o,int l,int r,int q){
        if(l==r) return val[o];
        int mid=(l+r)>>1;
        if(q<=mid) return query(lc[o],l,mid,q);
        else return query(rc[o],mid+1,r,q); 
    }
}tree;
int n,m;
int main(){
    //freopen("lys.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    tree.build(rt[0],1,n);
    for(int i=1;i<=m;i++){
        int pre,opt,x;
        scanf("%d%d%d",&pre,&opt,&x);
        if(opt==1) { int v;
          scanf("%d",&v);
          tree.ins(rt[i],rt[pre],1,n,x,v);
        }
        if(opt==2) {
            printf("%d\n",tree.query(rt[pre],1,n,x));rt[i]=rt[pre];
        }
    }
}

 

标签:pre,洛谷,val,int,30,mid,rc,持久,P3919
来源: https://www.cnblogs.com/liyishui2003/p/16542658.html