[luogu3919]可持久化数组【主席树】
链接: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]可持久化数组【主席树】的更多相关文章
- 洛谷P3919 【模板】可持久化数组 [主席树]
		
题目传送门 可持久化数组 题目描述 如题,你需要维护这样的一个长度为 $N$ 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对 ...
 - P3919 (模板)可持久化数组 (主席树)
		
题目链接 Solution 主席树水题,连差分的部分都不需要用到. 直接用主席树的结构去存一下就好了. Code #include<bits/stdc++.h> #define mid ( ...
 - LUOGU P3919 【模板】可持久化数组(主席树)
		
传送门 解题思路 给每一时刻建一棵线段树维护当前时刻的值,然后修改的时候直接修改,查询的时候直接查,记住查询完后一定要复制. 代码 #include<iostream> #include& ...
 - BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
		
BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...
 - zoj2112 树状数组+主席树  区间动第k大
		
Dynamic Rankings Time Limit: 10000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Subm ...
 - 【bzoj1146】[CTSC2008]网络管理Network  倍增LCA+dfs序+树状数组+主席树
		
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
 - 【bzoj3744】Gty的妹子序列  分块+树状数组+主席树
		
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
 - BZOJ_2120_数颜色_Set+树状数组+主席树
		
BZOJ_2120_数颜色_Set+树状数组+主席树 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L ...
 - P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]
		
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
 
随机推荐
- linux RPM manager
			
RPM manage:rpm2cpio package_name | cpio -id #将一个rpm包解压至当前目录rpm -qi package_name #查看一个已安装的rpm包信息rpm - ...
 - php ajax登录注册
			
用户登录与退出功能应用在很多地方,而在有些项目中,我们需要使用Ajax方式进行登录,登录成功后只刷新页面局部,从而提升了用户体验度.本文将使用PHP和jQuery来实现登录和退出功能. 准备数据库 本 ...
 - 【CV】ICCV2015_Describing Videos by Exploiting Temporal Structure
			
Describing Videos by Exploiting Temporal Structure Note here: it's a learning note on the topic of v ...
 - Linux课题实践四——ELF文件格式分析
			
2.4 ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...
 - Linux实践:文件破解
			
Linux实践:文件破解 标签(空格分隔): 20135321余佳源 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP指令 ...
 - A11-java学习-二维数组-面向对象概念-类的编写-测试类的编写-创建对象-使用对象-递归
			
二维数组的内存结构和使用 引用类型的内存结构 栈区.堆区.方法区.数据栈等内存分析和介绍 面向对象.面向过程区别和发展 类型的定义 引用类型.值类型 预定义类型和自定义类型 类型与对象(实例) 对象的 ...
 - Java的常用命令javac与java
			
javac 可以使用javac -h来查看常用的命令: -> ~ # javac -help 用法: javac <options> <source files> 其中, ...
 - MySQL的Blob类型的手工编辑(manually edit)
			
https://dba.stackexchange.com/questions/17593/in-mysql-how-to-manually-edit-values-of-a-blob-column- ...
 - Activiti reassign task to another user
			
//早先胡乱尝试的其他方法,可能对于以后深入学习Activiti有些用处. //taskService.delegateTask(taskId, receiveUserId); //taskServi ...
 - 面象对象设计原则之二:开放封闭原则(Open-Closed Principle, OCP)
			
开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则.开闭原则由Bertrand Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed Principle, ...