[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 不断地收集新的贝壳,因此,他的项链 ...
随机推荐
- zuul简单使用
zuul路由的几个配置参数1.静态路由 zuul: routes: myroute1: path: /mypath/** url: http://localhost:8080 (注意这里url要htt ...
- vue 首页背景图片加载完成前增加 loading 效果 -- 使用 new Image() 实现
1. 创建 loading 公用组件 <template> <div class="load-container"> <div class=" ...
- spring cloud服务提供与调用示例
本文创建方式采用intellij IDEA 创建项目 1.创建基于Eureka的注册中心. 在打开项目中右键,选择new 选择moudle 然后下一步 输入要创建的项目的信息 选择web下面的web ...
- Visual Studio2017 Remote Debugger
前言 大家在使用vs打包后的文件部署到服务器后,有时候我们需要对线网的后台进行调试.但是它不像在VS中.这个时候我们该怎么调试呢? 微软想到了这一点,他们在 VS 中给我们提供了一个功能: Remot ...
- webpack教程(一)——初体验
首先全局安装webpack,再npm初始化一个项目,并局部安装webpack开发工具 $ npm install webpack -g npm init (项目名称) $ npm install we ...
- 2018年高教社杯全国大学生数学建模竞赛A题解题思路
题目 先贴一下A的题目吧 A题 高温作业专用服装设计 在高温环境下工作时,人们需要穿着专用服装以避免灼伤.专用服装通常由三层织物材料构成,记为I.II.III层,其中I层与外界环境接触,III层与 ...
- Linux内核分析——ELF文件格式分析
ELF文件(目标文件)格式主要三种: 1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为 ...
- 《Linux内核分析》期终总结
作者:杨舒雯,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 目录: 1.通过简 ...
- Beta之后的想法
软件工程如果没选实践,单纯在理论课上面对教条化的理论,这些理论都是很有指导意义的,但没有实践课带来的切实的多人团队合作开发项目的实际体会,很难能领会到其中的深意.知行合一,才能发现软件工程里的知识都是 ...
- [转] Linux有问必答:如何修复“sshd error: could not load host key”
编译自:http://ask.xmodulo.com/sshd-error-could-not-load-host-key.html作者: GOLinux 本文地址:https://linux.cn/ ...