码迷,mamicode.com
首页 > 编程语言 > 详细

LUOGU P3919 【模板】可持久化数组(主席树)

时间:2018-11-15 01:29:36      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:mat   getch   date   query   lib   upd   i++   ++   cst   

传送门

解题思路

  给每一时刻建一棵线段树维护当前时刻的值,然后修改的时候直接修改,查询的时候直接查,记住查询完后一定要复制。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

using namespace std;
const int MAXN = 1000005;

inline int rd(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {f=ch==‘-‘?0:1;ch=getchar();}
    while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
    return f?x:-x;
}

int n,m,a[MAXN],rt[MAXN],cnt;
int val[MAXN*22],ls[MAXN*22],rs[MAXN*22];

int build(int l,int r){
    int now=++cnt,mid=(l+r)>>1;
    if(l==r) {
        val[now]=rd();
        return now;
    }
    ls[now]=build(l,mid);rs[now]=build(mid+1,r);
    return now;
}

int update(int pre,int l,int r,int x,int k){
    int now=++cnt,mid=(l+r)>>1;
    ls[now]=ls[pre];rs[now]=rs[pre];val[now]=val[pre];
    if(l==r) {val[now]=k;return now;}
    if(x<=mid) ls[now]=update(ls[pre],l,mid,x,k);
    else rs[now]=update(rs[pre],mid+1,r,x,k);
    return now; 
}

int query(int pre,int l,int r,int x){
    if(l==r) return val[pre];
    int mid=(l+r)>>1;
    if(x<=mid) return query(ls[pre],l,mid,x);
    else return query(rs[pre],mid+1,r,x);
}

int main(){
    n=rd(),m=rd();rt[0]=build(1,n);int pre,op,x,y;
    for(int i=1;i<=m;i++){
        pre=rd(),op=rd(),x=rd();
        if(op==1) y=rd(),rt[i]=update(rt[pre],1,n,x,y);
        else printf("%d\n",query(rt[pre],1,n,x)),rt[i]=rt[pre];
    }   
    return 0;
}

LUOGU P3919 【模板】可持久化数组(主席树)

标签:mat   getch   date   query   lib   upd   i++   ++   cst   

原文地址:https://www.cnblogs.com/sdfzsyq/p/9961290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!