• 洛谷3919:可持久化数组——题解


    https://www.luogu.org/problemnew/show/P3919

    如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作

    1. 在某个历史版本上修改某一个位置上的值

    2. 访问某个历史版本上的某一位置的值

    此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示初始状态数组)

    这题题意看错了就很伤……操作2新建的版本是它所询问的历史版本emmm……

    以及各种小错误,int没return,y打成x,以及脑子抽了加了个k++。

    总之做过BZOJ3673 & BZOJ3674 & 洛谷3402:可持久化并查集之后做这道题就很简单啦。

    我们开主席树记录修改和询问就ok啦。

    好像题解写到这里就没了emmmm……

    #include<cstdio>
    #include<queue>
    #include<cctype>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int N=1e6+5;
    inline int read(){
        int X=0,w=0;char ch=0;
        while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
        while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        return w?-X:X;
    }
    struct tree{
        int l,r,v;
    }tr[N*20];
    int a[N],rt[N],n,m,pool;
    inline void build(int &x,int l,int r){
        x=++pool;
        if(l==r){
        tr[x].v=a[l];
        return;
        }
        int mid=(l+r)>>1;
        build(tr[x].l,l,mid);
        build(tr[x].r,mid+1,r);
    }
    inline void modify(int y,int &x,int l,int r,int pos,int v){
        tr[x=++pool]=tr[y];
        if(l==r){
        tr[x].v=v;
        return;
        }
        int mid=(l+r)>>1;
        if(pos<=mid)return modify(tr[y].l,tr[x].l,l,mid,pos,v);
        else modify(tr[y].r,tr[x].r,mid+1,r,pos,v);
    }
    inline int query(int x,int l,int r,int pos){
        if(l==r)return tr[x].v;
        int mid=(l+r)>>1;
        if(pos<=mid)return query(tr[x].l,l,mid,pos);
        else return query(tr[x].r,mid+1,r,pos);
    }
    int main(){
        n=read(),m=read();
        for(int i=1;i<=n;i++)a[i]=read();
        build(rt[0],1,n);
        for(int i=1;i<=m;i++){
        rt[i]=rt[i-1];
        int k=read(),op=read();
        if(op==1){
            int pos=read(),v=read();
            modify(rt[k],rt[i],1,n,pos,v);
        }
        if(op==2){
            int pos=read();
            printf("%d
    ",query(rt[k],1,n,pos));
            rt[i]=rt[k];
        }
        }
        return 0;
    }

    +++++++++++++++++++++++++++++++++++++++++++

     +本文作者:luyouqi233。               +

     +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

    +++++++++++++++++++++++++++++++++++++++++++

    转载于:https://www.cnblogs.com/luyouqi233/p/8678332.html

  • 相关阅读:
    Criteria和Detachedcriteria的区别及应用(转)
    Hibernate中DetachedCriteria的使用(转)
    jQuery的dom操作
    MyEclipse6.5安装SVN插件的三种方法(转)
    hibernate反向生成实体类
    PHP写文本日志
    关于微软ADO.NET提供的组件库里的UpdateDataSet()的用法心得
    比较文件内容是否一致
    在ListView的顶部和底部加入其他View
    Android中使用shape来定义控件的显示属性
  • 原文地址:https://www.cnblogs.com/twodog/p/12137202.html
Copyright © 2020-2023  润新知