可持久化数据结构学习笔记

news/2025/2/15 8:40:55/文章来源:https://www.cnblogs.com/JPGOJCZX/p/18716488

可持久化数组

例题

可持久化线段树

算法流程

复杂度分析

例题

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
int a[N], b[N], root[N], cnt, n, m;
struct{int L, R, sum;
} tree[N << 5];
int build(int pl, int pr){int rt = ++cnt;tree[rt].sum = 0;int mid = (pl + pr) >> 1;if(pl < pr){tree[rt].L = build(pl, mid);tree[rt].R = build(mid + 1, pr);}return rt;
}
int modify(int pre, int pl, int pr, int x){int rt = ++cnt;tree[rt].L = tree[pre].L;tree[rt].R = tree[pre].R;tree[rt].sum = tree[pre].sum + 1;int mid = (pl + pr) >> 1;if(pl < pr){if(x <= mid)tree[rt].L = modify(tree[pre].L, pl, mid, x);elsetree[rt].R = modify(tree[pre].R, mid + 1, pr, x);}return rt;
}
int query(int u, int v, int pl, int pr, int k){if(pl == pr)return pl;int x = tree[tree[v].L].sum - tree[tree[u].L].sum;int mid = (pl + pr) >> 1;if(x >= k)return query(tree[u].L, tree[v].L, pl, mid, k);elsereturn query(tree[u].R, tree[v].R, mid + 1, pr, k - x);
}
int main(){scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++){scanf("%d", &a[i]);b[i] = a[i];}sort(b + 1, b + n + 1);int size = unique(b + 1, b + n + 1) - (b + 1);for(int i = 1; i <= n; i++){int x = lower_bound(b + 1, b + size + 1, a[i]) - b;root[i] = modify(root[i - 1], 1, size, x);}while(m--){int x, y, k;scanf("%d%d%d", &x, &y, &k);printf("%d\n", b[query(root[x - 1], root[y], 1, size, k)]);}return 0;
}

可持久化并查集

可持久化可并堆

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

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

相关文章

五分钟搞定!Linux平台上用Ansible自动化部署SQL Server AlwaysOn集群

五分钟搞定!Linux平台上用Ansible自动化部署SQL Server AlwaysOn集群前言 以下内容是由红帽官方博客整理而成,使用Ansible在Linux平台上自动化部署SQL Server AlwaysOn集群不熟悉整个流程的朋友可以先看之前的部署文章,手动部署一遍 从DNS配置到Pacemaker部署:一步步教你在…

Wireshark的部署(学习笔记)

〇、大纲 1、远程数据包捕获 2、集线器环境下数据包捕获 3、交换机环境下数据包捕获 4、本地流量的捕获 5、虚拟机流量的捕获 一、远程数据包捕获 情形:需要异地管理分析服务器流量,有服务器控制权。方案:使用WinPcap下的Rpcap运行在目标服务器上,向远程控制机传回流量。服…

LeetCode 第24题:两两交换链表中的节点

LeetCode 第24题:两两交换链表中的节点 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 难度 中等 题目链接 https://leetcode.cn/problems/swap-nodes-in-pairs/ 示例 示…

LeetCode 第25题:K 个一组翻转链表

LeetCode 第25题:K 个一组翻转链表 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 不能只是单纯的改变节点内部的值,…

HJ25 数据分类处理

题目:我的答案: #include <iostream> #include <string> #include <vector> #include <set> #include <map>using namespace std;bool match(const int R, const string &I) {if (I.find(to_string(R)) != std::string::npos){return true;}…

Java Web - 后端

Java Web 后端的基础知识: Maven, Spring Boot, MySQL, JDBC, MyBatisJava Web - 后端 Maven 基于项目对象模型 (POM) 的概念, 通过一小段描述信息来管理项目的构建 官网各种插件以构建生命周期/阶段依赖管理模型从仓库中查找 jar包仓库: 存储资源, 管理 jar包本地仓库: 自己计…

汇编语言笔记_1

汇编语言学习笔记(一)1.基础知识 汇编语言是直接在硬件上工作的语言,本章重在了解硬件系统结构 1.1 机器语言 CPU(中央处理单元)是一种微处理器,功能是执行机器指令每一种微处理器由于硬件设计和内部结构的不同,有自己的机器指令集,也就是机器语言由于机器码晦涩难懂和…

基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证

1.算法运行效果图预览 (完整程序运行后无水印)这里实现的是256*256双线性插值到512*512的系统模块局部放大:将数据导入到matlab,得到插值效果图:2.算法运行软件版本 matlab2022avivado2019.23.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)`timescale 1ns / 1…

Windows Teminal 自定义标题

背景与痛点场景: 开发环境,用命令行开了好几个微服务,窗口标题都是一样的,不好分清哪个窗口是哪个服务的了。所有窗口默认显示相同的标题(如"C:\Windows\System32\cmd.exe dotnet run")。窗口多了,切换也不方便。 解决方案: 使用Windows Teminal 来运行命令启…

前端开发day2

前端开发day2 今日概要:案例应用(利用之前所学知识) CSS知识点 模板 + CSS + 构建页面1.CSS案例 1.1 内容回顾HTML标签 固定格式,记住标签长什么样子,例如: h/div/span/a/img/ul/li/table/input/formCSS样式引用CSS:标签、头部、文件 .xx{... }<div class=xx xx>&…