acwing算法提高之数据结构--可持久化数据结构

目录

  • 1 介绍
  • 2 训练

1 介绍

本专题用来记录可持久化数据结构相关的题目。

本专题主要讲如下两类数据结构的可持久化:

  1. trie的可持久化
  2. 线段树的可持久化,即主席树

可持久化的前提:本身的拓扑的结构不变

解决什么类型的问题:可以保存下来数据结构的所有历史版本。
核心思想:只记录每一个版本与前一个版本不同的结点。

2 训练

题目1:256最大异或和

C++代码如下,

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 600010, M = N * 25;int n, m;
int s[N];
int tr[M][2], max_id[M];
int root[N], idx;void insert(int i, int k, int p, int q) {if (k < 0) {max_id[q] = i;return;}int v = s[i] >> k & 1;if (p) tr[q][v^1] = tr[p][v^1];tr[q][v] = ++idx;insert(i, k-1, tr[p][v], tr[q][v]);max_id[q] = max(max_id[tr[q][0]], max_id[tr[q][1]]);
}int query(int root, int C, int L) {int p = root;for (int i = 23; i >= 0; --i) {int v = C >> i & 1;if (max_id[tr[p][v^1]] >= L) p = tr[p][v^1];else p = tr[p][v];}return C ^ s[max_id[p]];
}int main() {scanf("%d%d", &n, &m);max_id[0] = -1;root[0] = ++idx;insert(0, 23, 0, root[0]);for (int i = 1; i <= n; ++i) {int x;scanf("%d", &x);s[i] = s[i-1] ^ x;root[i] = ++idx;insert(i, 23, root[i-1], root[i]);}char op[2];int l, r, x;while (m--) {scanf("%s", op);if (*op == 'A') {scanf("%d", &x);n++;s[n] = s[n-1] ^ x;root[n] = ++idx;insert(n, 23, root[n-1], root[n]);} else {scanf("%d%d%d", &l, &r, &x);printf("%d\n", query(root[r-1], s[n]^x, l-1));}}return 0;
}

题目2:255第K小数

C++代码如下,

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int N = 100010, M = 10010;int n, m;
int a[N];
vector<int> nums;struct Node {int l, r;int cnt;
}tr[N * 4 + N * 17];int root[N], idx;int find(int x) {return lower_bound(nums.begin(), nums.end(), x) - nums.begin();
}int build(int l, int r) {int p = ++idx;if (l == r) return p;int mid = l + r >> 1;tr[p].l = build(l, mid), tr[p].r = build(mid + 1, r);return p;
}int insert(int p, int l, int r, int x) {int q = ++idx;tr[q] = tr[p];if (l == r) {tr[q].cnt++;return q;}int mid = l + r >> 1;if (x <= mid) tr[q].l = insert(tr[p].l, l, mid, x);else tr[q].r = insert(tr[p].r, mid + 1, r, x);tr[q].cnt = tr[tr[q].l].cnt + tr[tr[q].r].cnt;return q;
}int query(int q, int p, int l, int r, int k) {if (l == r) return r;int cnt = tr[tr[q].l].cnt - tr[tr[p].l].cnt;int mid = l + r >> 1;if (k <= cnt) return query(tr[q].l, tr[p].l, l, mid, k);else return query(tr[q].r, tr[p].r, mid + 1, r, k - cnt);
}int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i) {scanf("%d", &a[i]);nums.push_back(a[i]);}sort(nums.begin(), nums.end());nums.erase(unique(nums.begin(), nums.end()), nums.end());root[0] = build(0, nums.size() - 1);for (int i = 1; i <= n; ++i) {root[i] = insert(root[i-1], 0, nums.size() - 1, find(a[i]));}while (m--) {int l, r, k;scanf("%d%d%d", &l, &r, &k);printf("%d\n", nums[query(root[r], root[l-1], 0, nums.size() - 1, k)]);}return 0;
}

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

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

相关文章

【图论】图论基础

图论不同地方讲的不太一样&#xff0c;本文仅限作者的理解 定义 图一般由点集 V V V 和边集 E E E 组成。 对于 v ∈ V v\in V v∈V&#xff0c;称 v v v 为该图的一个节点。 对于 e ∈ E e\in E e∈E&#xff0c;一般用二元组 ( u , v ) (u,v) (u,v) 表示 e e e&…

Linux 根据提交记录生成补丁及新旧文件对比

#!/bin/bash#解决/bin/bash^M: bad interpreter: Text file busy #sed -i s/\r$// test1.shCMD1$1 CMD2$2 CMD3$3 echo "CMD1 > $CMD1" echo "CMD2 > $CMD2" echo "CMD3 > $CMD3" # 运行时的入参 CMD1提交记录1 CMD2提交记录2 CMD3输出…

短视频素材有哪些方法获得?推荐8个短视频素材免费资源

在这个视觉内容至关重要的时代&#xff0c;拥有高质量视频素材对于任何视频创作者来说都是必不可少的。视频素材不仅可以增强叙事的深度&#xff0c;还能显著提升观众的参与度。为了帮助你找到理想的视频素材&#xff0c;以下是全球范围内提供顶级视频素材的网站列表&#xff0…

基于FPGA的数字信号处理(5)--Signed的本质和作用

前言 Verilog中的signed是一个很多人用不好&#xff0c;或者说不太愿意用的一个语法。因为不熟悉它的机制&#xff0c;所以经常会导致运算结果莫名奇妙地出错。其实了解了signed以后&#xff0c;很多时候用起来还是挺方便的。 signed的使用方法主要有两种&#xff0c;其中一种…

笔记-用Python脚本启停JAR程序

用Python脚本启停JAR程序&#xff0c;需要用到python中的以下内置模块 subprocess 是 Python 的一个标准库模块&#xff0c;用于在新进程中执行子命令&#xff0c;获取子进程的输入/输出/错误以及返回码等os 是 Python 的一个标准库模块&#xff0c;它提供了与操作系统交互的功…

金融案例:统一查询方案助力数据治理与分析应用更高效、更安全

随着企业数据规模的增长和业务多元化发展&#xff0c;海量数据实时、多维地灵活查询变成业务常见诉求。同时多套数据库系统成为常态&#xff0c;这既带来了数据管理的复杂性&#xff0c;又加大了数据使用的难度&#xff0c;面对日益复杂的数据环境和严格的数据安全要求&#xf…

flexpaper 远程命令执行

flexpaper 远程命令执行 这个是有POC的&#xff0c;先简单复现一下 GET /ipg/static/appr/lib/flexpaper/php/view.php?doc1.docx"%26echoshell>shel233l.txt%23&pageexp&formatswf&callbackcallback&isSplittrue HTTP/1.1 Host: 192.168.50.22 Use…

【蓝桥杯】第十五届蓝桥杯C/C++B组省赛补题

文章目录 估分试题 A: 握手问题试题 B: 小球反弹试题 C: 好数试题 D: R 格式试题 E: 宝石组合试题 F: 数字接龙试题 G: 爬山试题 H: 拔河 估分 测试网址&#xff1a;民间测试数据 5 0 9 5 2 5 18 2 46 5 0 9 5 2 5 18 2 46 50952518246 试题 A: 握手问题 #inc…

【PSINS函数讲解】IMU误差设置方法——imuerrset

所用函数 imuerrset 函数使用形式 此函数用于输入IMU的相关误差参数,返回对应的IMU误差设置,工具箱中的一般使用形式为: imuerr = imuerrset(0, 0, 0.01, 100);上述的四个输入为函数的基本输入,分别为: 陀螺仪常值误差(单位:/小时)加速度常值误差(单位:ug,即约为…

Python 机器学习 基础 之 学习 基础环境搭建

Python 机器学习 基础 之 学习 基础环境搭建 目录 Python 机器学习 基础 之 学习 基础环境搭建 一、简单介绍 二、什么是机器学习 三、python 环境的搭建 1、Python 安装包下载 2、这里以 下载 Python 3.10.9 为例 3、安装 Python 3.10.9 4、检验 python 是否安装成功&…

Systemback Ubuntu14.04 制作自定义系统ISO镜像

工作需要&#xff0c;要基于ubuntu自定义一些编译环境并将自己配置好的ubuntu做成镜像。 硬件准备 ​ 为保证能够顺利完成系统iso镜像的制作与系统还原&#xff0c;推荐准备一个较大容量的U盘或者移动固态硬盘&#xff0c;同时确保自己的Ubuntu系统还有比较大的可用空间。 1 S…

【DevOps】Docker安装和使用示例

一、Ubuntu 20.04 上安装 Docker 在 Ubuntu 20.04 上安装 Docker 可以通过几种不同的方法完成&#xff0c;其中最简单和最常见的方法是使用 Docker 的官方安装脚本&#xff0c;或者通过 Ubuntu 的包管理工具 apt 手动安装。这里我将介绍两种方法&#xff1a;使用 Docker 的便捷…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统&#xff0c;支持各种编程语言和工具。 Jenkins是一款开…

美团代付系统源码搭建ZHU16728

2024美团外卖点单代付系统源码基于php 基础开发&#xff0c;这套系统搭载了外卖系统属性&#xff0c;可添加物流信息。 1.完美对接微信支付&#xff0c;支付宝支付。 2.这套系统全新UI界面&#xff0c;完美搭建可以用作商用系统服务。 3.前端UI界面内容丰富&#xff0c;功能齐全…

有关CSS中排版常见问题(清除默认样式问题 + 元素居中问题 + 元素之间的空白问题 + 行内块的幽灵空白问题)

前言&#xff1a;在练习CSS排版的时候&#xff0c;我们经常会遇到一些排版上的问题&#xff0c;那么我们如何去解决这些问题呢&#xff1f;本篇文章给出了一些新手在练习排版时候可能会遇到的问题的解决方案。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

【消息队列】RabbitMQ五种消息模式

RabbitMQ RabbitMQRabbitMQ安装 常见的消息模型基本消息队列SpringAMQPWorkQueue消息预取发布订阅模式Fanout ExchangeDirectExchangeTopicExchange 消息转换器 RabbitMQ RabbitMQ是基于Erlang语言开发的开源消息通信中间件 官网地址&#xff1a;https://www.rabbitmq.com/ R…

【VUE】Vue中实现树状表格结构编辑与版本对比的详细技术实现

Vue中实现树状表格结构编辑与版本对比的详细技术实现 在Vue中&#xff0c;创建一个可编辑的树状表格并实施版本对比功能是一种需求较为常见的场景。在本教程中&#xff0c;我们将使用Vue结合Element UI的el-table组件&#xff0c;来构建一个树状表格&#xff0c;其中包含添加、…

速盾:什么是cdn架构

CDN&#xff08;Content Delivery Network&#xff09;即内容分发网络&#xff0c;是一种分布式的架构&#xff0c;用于提高互联网上的内容传输速度和用户体验。CDN架构通过将内容分发到全球多个节点&#xff0c;使用户能够从最近的节点获取内容&#xff0c;从而减少延迟和网络…

第15届蓝桥杯-蒟蒻の反思与总结

基本情况 第15届蓝桥杯&#xff0c;参加c大学A组&#xff0c;完整做出的只有两道填空题。 然后后面的题目基本只拿了20%这样的分数&#xff0c;最后两道15分题目空白。 满分100分&#xff0c;估计总分在15-20分这样。 对于二分答案还是没有太熟练&#xff0c;考试的时候没有…

深入探究C++四大关键特性:初始化列表、友元函数、内部类与static成员

目录 1. 构造函数不为人知的那些事 1.1 构造函数体赋值与初始化列表对比 1.2 explicit关键字与构造函数隐式转换 2. static成员 2.1 static成员的概念 2.2 static成员的特性与应用 2.3 小结 3. C11 成员变量初始化新用法 4. 友元 4.1 友元函数 4.2 友元类 5. 内部类…