zoukankan      html  css  js  c++  java
  • 【洛谷】P3919 【模板】可持久化线段树(主席树)

    题目

    传送门:QWQ

    分析

    主席树的模板,囤着


    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1000010;
    int ls[N*20], rs[N*20], root[N*20], newp, sum[N*20], a[N*20];
    
    inline void insert(int l,int r,int x,int pos,int& cur,int cur1)
    {
        cur=++newp;
        ls[cur]=ls[cur1]; rs[cur]=rs[cur1]; sum[cur]=sum[cur1];
        if(l==r) { sum[cur]=x; return; }
        int mid=l+r>>1;
        if(pos<=mid) insert(l,mid,x,pos,ls[cur],ls[cur1]);
        else insert(mid+1,r,x,pos,rs[cur],rs[cur1]);
    }
    
    inline void build(int l,int r,int& cur)
    {
        cur=++newp;
        if(l==r) { sum[cur]=a[l]; return; }
        int mid=l+r>>1;
        build(l,mid,ls[cur]); build(mid+1,r,rs[cur]);
    }
    
    inline int query(int l,int r,int pos,int cur)
    {
        if(l==r) return sum[cur];
        int mid=l+r>>1;
        if(pos<=mid) return query(l,mid,pos,ls[cur]);
        else return query(mid+1,r,pos,rs[cur]);
    }
    
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        build(1,n,root[0]);
        
        int v1,opt,x,pos;
        for(int i=1;i<=m;i++)
        {
             scanf("%d%d",&v1,&opt);
            root[i]=root[v1];
            if(opt==1){
                scanf("%d%d",&pos,&x);
                insert(1,n,x,pos,root[i],root[i]);
            }
            else{
                scanf("%d",&pos);
                printf("%d
    ",query(1,n,pos,root[v1]));
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Java基础50道经典练习题(33)——杨辉三角
    Java基础50道经典练习题(32)——左移右移
    团队第二阶段冲刺04
    团队第二阶段冲刺03
    团队第二阶段冲刺02
    团队第二阶段冲刺01
    团队意见汇总
    各组意见汇总
    团队第一阶段冲刺07
    绩效评估01
  • 原文地址:https://www.cnblogs.com/noblex/p/8419928.html
Copyright © 2011-2022 走看看