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

分析

很明显我们可以用主席树来维护,所谓主席树就是可持久化线段树,能够查询历史版本而且可以实现修改操作,反正就是复制了一遍。其原理就是动态开点复制前驱版本,在复制版本中做我们需要的所有的操作,然后我们需要记录每一个节点的根节点,表示线段树是哪一个历史版本。

ac代码

#include <bits/stdc++.h>
#define N 1000005
using namespace std;
struct Last_segment_tree {
    #define mid ((l+r)>>1)
    struct node {
        int lc, rc, s;//记录我们的左右儿子
        node() {}
    }tr[N*20];//开大一点没有问题,开小了就wa掉了
    int tot;
    Last_segment_tree() {//构造函数,也就是赋初值的意思
        tot = 0;
    }
    void build(int &nod, int l, int r, int *a) {//取地址的原因和动态开点线段树一样,我们需要记录左右儿子的标号
        nod = ++ tot;
        if (l == r) {
            tr[nod].s = a[l];
            return;
        }
        build(tr[nod].lc, l, mid, a);
        build(tr[nod].rc, mid + 1, r, a);
    }
    void update(int &nod, int pre, int l, int r, int k, int v) {
        nod = ++ tot;
        tr[nod] = tr[pre];
        if (l == r) {
            tr[nod].s = v;
            return;
        }
        if (k <= mid) update(tr[nod].lc, tr[pre].lc, l, mid, k, v);
        else update(tr[nod].rc, tr[pre].rc, mid + 1, r, k, v);
    }
    int query(int nod, int l, int r, int k) {
        if (l == r) return tr[nod].s;
        if (k <= mid) return query(tr[nod].lc, l, mid, k);
        else return query(tr[nod].rc, mid + 1, r, k);
    }
}lstr;
int a[N], rt[N];
int n, m;
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
    lstr.build(rt[0], 1, n, a);
    for (int i = 1; i <= m; i ++) {
        int pre, opt, loc, val;
        scanf("%d%d%d", &pre, &opt, &loc);
        if (opt == 1) {
            scanf("%d", &val);
            lstr.update(rt[i], rt[pre], 1, n, loc, val);
        }
        else {
            printf("%d\n", lstr.query(rt[pre], 1, n, loc));
            rt[i] = rt[pre];//题目中说的这个也算是一个历史版本
        }
    }
    return 0;
}

[luogu3919]可持久化数组【主席树】的更多相关文章

  1. 洛谷P3919 【模板】可持久化数组 [主席树]

    题目传送门 可持久化数组 题目描述 如题,你需要维护这样的一个长度为 $N$ 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对 ...

  2. P3919 (模板)可持久化数组 (主席树)

    题目链接 Solution 主席树水题,连差分的部分都不需要用到. 直接用主席树的结构去存一下就好了. Code #include<bits/stdc++.h> #define mid ( ...

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

    传送门 解题思路 给每一时刻建一棵线段树维护当前时刻的值,然后修改的时候直接修改,查询的时候直接查,记住查询完后一定要复制. 代码 #include<iostream> #include& ...

  4. BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树

    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...

  5. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  6. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  7. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

    题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...

  8. BZOJ_2120_数颜色_Set+树状数组+主席树

    BZOJ_2120_数颜色_Set+树状数组+主席树 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L ...

  9. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

随机推荐

  1. 使用Hexo+Github搭建属于自己的博客(进阶)

    主题的配置:这里以NexT主题作为题材 1.安装NexT,在其文件夹中鼠标右键,点击Git Base Here.输入命令:git clone https://github.com/iissnan/he ...

  2. 【C#实现漫画算法系列】-判断 2 的乘方

    微信上关注了算法爱好者这个公众号,有一个漫画算法系列的文章生动形象,感觉特别好,给大家推荐一下(没收过广告费哦),原文链接:漫画算法系列.也看到了许多同学用不同的语言来实现算法,作为一枚C#资深爱好的 ...

  3. “论 ofo 是如何影响今日头条发展的”

    近段时间, ofo 小黄车押金难退的消息频频曝出.尽管 OFO 已经宣布押金只能在线上退还,但是线上退押金也难,因此很多的用户还是选择到 ofo 北京总部“要个说法”.记者昨天在现场发现,位于北京中关 ...

  4. 通过清华TUNA镜像源下载Android源码

    建议参考官方教程:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 以下为自己测试时执行的步骤: 1.下载repo $ curl https://mirr ...

  5. Centos7系统下修改主机名操作笔记

    习惯了在Centos6系统下修改主机名的操作,但是Centos7下修改主机名的操作却大不相同!操作笔记如下: 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient) ...

  6. MySQL两种存储引擎: MyISAM和InnoDB 简单总结

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  7. C. Banh-mi

    链接 [http://codeforces.com/contest/1062/problem/C] 题意 给你有n个字符(0 or 1)的串,当去某个位置时所有的剩下的位置都加上这个位置的数字,q次查 ...

  8. Microsoft Visual Studio2013安装及单元测试

    和大家分享一下我安装VS2013和单元测试的过程.VS是微软多种编程软件的集合,功能与工作环境更全面,相比VC++6.0来说是一个很大的提升. VS安装: VS的安装和普通软件相同,只是花费的时间很长 ...

  9. 读《移山之道——VSTS软件开发指南》

    读<移山之道>这本书差不多用了一个星期的时间,感觉还是收获了一些知识的,以前只是会简单地编个小程序(虽然现在也是这样),但看过这本书之后我对软件开发这个概念的认识度有了从一片模糊到了解大体 ...

  10. 基于SSH框架的考勤管理系统的设计与实现

    基于SSH框架的考勤管理系统的设计与实现