【主席树】可持久化数组(金牌导航 可持久化数据结构-3)

可持久化数组

金牌导航 可持久化数据结构-3

题目大意

给出一个序列a,让你执行若干操作,操作分为两种:
1.继承第v次操作后把第x个数改成y
2.查询第v次操作的第x个数的值

输入样例

5 10
59 46 14 87 41
0 2 1
0 1 1 14
0 1 1 57
0 1 1 88
4 2 4
0 2 5
0 2 4
4 2 1
2 2 2
1 1 5 91

输出样例

59
87
41
87
88
46

数据范围

1⩽N,M⩽106,1⩽xi⩽N,0⩽vi<i,−109⩽ai,yi⩽1091\leqslant N,M\leqslant 10^6,1\leqslant x_i\leqslant N,0\leqslant v_i< i,-10^9\leqslant a_i,y_i\leqslant 10^91N,M106,1xiN,0vi<i,109ai,yi109

解题思路

如果直接暴力存数组,每次操作copy一遍会TLE/MLE
这里可以用搜索树的方法,就是把每个操作和所继承的操作连一条边,然后搜索即可,时间O(m)O(m)O(m)(这里不做详解)
对于这样一个序列,可以用主席树来维护
对于每次修改就和模板一样,然后查询就直接搜目标节点即可
时间O(mlogn)O(mlogn)O(mlogn)不如搜索树?

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define N 1000010
using namespace std;
int n, m, x, y, v, p, w, g, num, a[N], s[N << 5], ls[N << 5], rs[N << 5], root[N];
int build(int l, int r) {int x = ++w;if (l == r) {s[x] = a[l];return x;}int mid = (l + r) >> 1;ls[x] = build(l, mid);rs[x] = build(mid + 1, r);return x;
}
int change(int lst, int v, int y, int l, int r) {int x = ++w;if (l == r) {s[x] = y;return x;}int mid = (l + r) >> 1;if (v <= mid)ls[x] = change(ls[lst], v, y, l, mid), rs[x] = rs[lst];elsels[x] = ls[lst], rs[x] = change(rs[lst], v, y, mid + 1, r);return x;
}
int ask(int v, int x, int l, int r) {if (l == r) {return s[v];}int mid = (l + r) >> 1;if (x <= mid)return ask(ls[v], x, l, mid);elsereturn ask(rs[v], x, mid + 1, r);
}
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);root[0] = build(1, n);for (int i = 1; i <= m; ++i) {scanf("%d%d%d", &v, &p, &x);if (p & 1) {scanf("%d", &y);root[i] = change(root[v], x, y, 1, n);//修改} else {root[i] = root[v];//数组没变,直接copyprintf("%d\n", ask(root[v], x, 1, n));//查询}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[集训队作业2018] 复读机(生成函数,单位根反演)

传送门 subtask 1&#xff1a;d1d1d1 答案为knk^nkn。 subtask 2&#xff1a;n≤1000,k≤100n\leq1000,k\leq 100n≤1000,k≤100 设f[i][j]f[i][j]f[i][j]表示由iii个复读机来分jjj个时间点的方案数。 可以得到递推式&#xff1a; f[i][j]∑p0j[d∣p]Cjpf[i−1][j−p]f[i][j…

jzoj5097-[GDOI2017day1]取石子游戏【并查集,LCA】

正题 题目链接:https://gmoj.net/senior/#main/show/5097 题目大意 nnn个点的一棵树&#xff0c;每个节点有权值。对于每个点求树上所有权值去除掉他的子树的权值后的mexmexmex值。 解题思路 对于一个权值www&#xff0c;权值为www的所有点的LCALCALCA到根节点的路径上都不会…

P2756 飞行员配对方案问题【网络流24题】

P2756 飞行员配对方案问题 文章目录题目背景题解&#xff1a;代码&#xff1a;题目背景 第二次世界大战期间&#xff0c;英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的两名飞行员&#xff0c;其中一名是英国…

大数据分析中使用关系型数据库的关键点

相当一部分大数据分析处理的原始数据来自关系型数据库&#xff0c;处理结果也存放在关系型数据库中。原因在于超过99%的软件系统采用传统的关系型数据库&#xff0c;大家对它们很熟悉&#xff0c;用起来得心应手。在我们正式的大数据团队&#xff0c;数仓&#xff08;数据仓库H…

【FHQ treap】维护书架(金牌导航 无旋式treap-1)

维护书架 金牌导航 无旋式treap-1 题目大意 给出一个序列a&#xff0c;编号为1~n&#xff0c;让你做若干操作&#xff0c;操作有五种&#xff1a; 1.把第x个数放在最前面 2.把第x个数放在最后面 3.把第x个数和第x1x\pm 1x1个数交换 4.查询编号为i的数前面有多少个数 5.查询第…

P5488-差分与前缀和【NTT,生成函数】

正题 题目链接:https://www.luogu.com.cn/problem/P5488 题目大意 求一个长度为nnn的序列的kkk阶差分/前缀和。 解题思路 先考虑前缀和怎么做 搞出来生成函数就是(∑i0naixi)∗(∑i0∞xi)k(\sum_{i0}^na_ix^i)*(\sum_{i0}^{\infty}x^i)^k(i0∑n​ai​xi)∗(i0∑∞​xi)k 然…

图论复习——最小生成树MST

知识点 MST的构造 Boruvka算法常用于解决这类问题&#xff1a;给你n个点&#xff0c;每个点有点权&#xff0c;任意两个点之间有边权&#xff0c;边权为两个点权用过某种计算方式得出&#xff0c;求最小生成树。动图 MST上的确定性和存在性问题 最小生成树的两个性质&#xf…

Ocelot简易教程(二)之快速开始1

Ocelot是为.net core量身定做的&#xff0c;目前是基于 netstandard2.0进行构建的。.NET Core 2.1中如何使用呢&#xff1f;安装NuGet package使用nuget安装Ocelot及其依赖项。您需要创建一个netstandard2.0项目并将其Package安装到项目中。然后按照下面的“启动”和“ 配置”节…

【树链剖分】【线段树】树的统计(金牌导航 树链剖分-1)

树的统计 金牌导航 树链剖分-1 题目大意 给出一棵树&#xff0c;让你做若干操作&#xff0c;操作如下&#xff1a; 1.修改一个节点的值 2.查询两个节点之间路径的最大值 3.查询两个节点之间路径的和 输入样例 4 1 2 2 3 4 1 4 2 1 3 12 QMAX 3 4 QMAX 3 3 QMAX 3 2 QMAX 2…

P2761 软件补丁问题

文章目录题目描述题解&#xff1a;代码&#xff1a;添加链接描述题目描述 T 公司发现其研制的一个软件中有 n 个错误&#xff0c;随即为该软件发放了一批共 m 个补丁程序。每一个补丁程序都有其特定的适用环境&#xff0c;某个补丁只有在软件中包含某些错误而同时又不包含另一些…

P4091-[HEOI2016/TJOI2016]求和【斯特林数,NTT】

正题 题目链接:https://www.luogu.com.cn/problem/P4091 题目大意 给出nnn&#xff0c;求 ∑i0n∑j0i{ij}2jj!\sum_{i0}^n\sum_{j0}^i\begin{Bmatrix}i\\j\end{Bmatrix}2^jj!i0∑n​j0∑i​{ij​}2jj! 解题思路 看题解才知道2jj!2^jj!2jj!对这nlog⁡nn\log nnlogn做法没有任…

Xamarin中国技术社区及BXUG官网上线啦

Xamarin中国技术社区及BXUG官网为.NET开发者提供移动跨平台技术学习的园地&#xff0c;为Xamarin及.NET技术达人提供展示分享的舞台&#xff0c; 为企业CTO等技术负责人提供跨平台移动应用解决方案的交流平台&#xff01;网址链接&#xff1a;http://bxug.bopoda.cn/Xamarin中国…

MST(最小生成树)的构造

是什么&#xff1a; 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n 个结点&#xff0c;并且有保持图连通的最少的边。 kruskal算法&#xff1a; #include<iostream> #include<vector> #include<algorithm> #incl…

【虚树】世界树(金牌导航 虚树-1/luogu 3233)

世界树 金牌导航 虚树-1 luogu 3233 题目大意 对于一棵树&#xff0c;给出若干询问&#xff0c;每个询问告诉你若干个特殊点&#xff0c;对于所有点&#xff0c;都会选择离自己最近&#xff08;距离相等就选编号最小的&#xff09;的特殊点&#xff0c;问对于所有特殊点&am…

用python将图片转换成二值图像

大创项目是图像识别&#xff0c;第一个任务是将一个图片转换成二值图像 之前用过python的numpy和turtle&#xff0c;这次要用到图像库PIL的类Image&#xff0c;也算是刚刚从零开始学起 整体效果&#xff08;用01串表示图像&#xff09; 原理很简单&#xff1a;将图片中黑色…

.Net Core SignalR 初体验

前言Asp.Net SignalR已经出来很久了&#xff0c;但是一直没有静下心来好好看看。昨天花了几个小时的时间看了下。首先借鉴了官方文档&#xff0c;如何搭建一个SignalR的Demo。参考文章&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?viewaspnet…

CF1251F-Red-White Fence【NTT】

前言 刚开始看错题推了半天的生成函数 正题 题目链接:https://www.luogu.com.cn/problem/CF1251F 题目大意 nnn个白色木板&#xff0c;kkk个红色木板&#xff0c;给出这些木板的高度&#xff0c;木板排成一排形成栅栏。栅栏要求只有一个红色木板且在红色木板左边单调升&…

图论复习——dfs树,点双,边双,强连通分量

知识点 dfs树 对一个图运行 dfs 算法&#xff0c;每个点uuu的父亲定义为第一次遍历uuu时的前驱结点&#xff0c;若无则为根。 无向图的 dfs树 没有横叉边。 有向图的 dfs树 横叉边方向唯一&#xff0c;总是从后访问的点指向先访问的点。 dfs树详解 tarjan 点双 定义&#…

Android 网络状态判断

1、获取网络信息&#xff0c;首先需要获取权限 <uses-permission android:name"android.permission.INTERNET" /> <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /> 2.1我们通过ConnectivityManager可以获取状态…

【点分治】Tree(luogu 4178/金牌导航 点分治-1)

Tree luogu 4178 金牌导航 点分治-1 题目大意 给出一棵树&#xff0c;问你书中路径长度小于等于k的点对个数有多少个 输入样例 5 1 2 3 1 3 1 1 4 2 3 5 1 4输出样例 8数据范围 1⩽N⩽41041\leqslant N \leqslant 4\times 10^41⩽N⩽4104 解题思路 对于该树&#xff0…