zoukankan      html  css  js  c++  java
  • 可持久化数组(线段树)[模板题]

    颓废 QAQ 随便乱刷题

    话说可持久化都这么简单吗?(可能可持久化并查集难一些,至于平衡树么….emmm非持久化板子都没过掉还可持久化)
    emmm,总这 这道题 还是蛮简单的

    其实这道题就没什么,类似我之前写的那棵主席树,用的思路类似,就是防止节点重复,尽量去借用节点
    只不过主席树中根的编号是前缀编号,可持久化线段树根的编号是历史版本的编号罢了

    //by Judge
    #include<iostream>
    #include<cstdio>
    #define mid (l+r>>1)
    using namespace std;
    const int M=1e6+11;
    inline int read() {  //压行读优
        int x=0,f=1; char c=getchar();
        for(; !isdigit(c); c=getchar()) if(c=='-') f=-1;
        for(; isdigit(c); c=getchar()) x=x*10+c-'0'; return x*f;
    }
    int n,m,cnt;
    int a[M],rt[M<<5],ch[M<<5][2],val[M<<5];
    void build(int& now,int l,int r) {  //建树,和普通主席树几乎一样的
        now=++cnt; if(l==r) return (void)(val[now]=a[l]);
        build(ch[now][0],l,mid), build(ch[now][1],mid+1,r);
    }
    void update(int& now,int las,int l,int r,int q,int v) {  //很类似,和主席树几乎一样的
        now=++cnt; if(l==r) return (void)(val[now]=v);
        // 然后判断 q 在 mid 左方或右方,左(右)儿子直接调用 las 的,右(左)儿子递归得到
        if(q<=mid) ch[now][1]=ch[las][1], update(ch[now][0],ch[las][0],l,mid,q,v);
        else ch[now][0]=ch[las][0], update(ch[now][1],ch[las][1],mid+1,r,q,v);
    }
    int query(int now,int l,int r,int q) {  //询问 历史版本 now 中的节点 q ,和主席树几乎一样的
        if(l==r) return val[now];
        if(q<=mid) return query(ch[now][0],l,mid,q);
        else return query(ch[now][1],mid+1,r,q);
    }
    int main() {  //主函数都是非常的简洁...可持久化线段树 50 行(压压行只有37)不到就可以操过去了QAQ
        n=read(), m=read();
        for(int i=1; i<=n; ++i) a[i]=read();
        build(rt[0],1,n);
        for(int i=1,pre,opt,x,y; i<=m; ++i) {
            pre=read(),opt=read();
            if(opt==1) {
                x=read(),y=read(),
                update(rt[i],rt[pre],1,n,x,y);  //将历史版本的信息传递进当前版本
            } else {
                x=read(),rt[i]=rt[pre],
                printf("%d
    ",query(rt[i],1,n,x)); //将询问版本的信息传入当前版本后直接询问即可
            }
        } return 0;
    }
  • 相关阅读:
    第 14 章 结构和其他数据形式(names3)
    第 14 章 结构和其他数据形式(names)
    第 13 章 文件输入/输出 (把文件附加到另一个文件末尾)
    第 13 章 文件输入/输出 (标准I/O)
    第 12 章 存储类别、链接和内存管理(存储类别)
    JS鼠标滚轮判断向上还是向下滚动
    js中一些自带方法和属性
    函数的传入的参数(实参和形参)
    css3实现翻书效果
    redis集群安装
  • 原文地址:https://www.cnblogs.com/Judge/p/9459559.html
Copyright © 2011-2022 走看看