可持久化(一)

参考博客
可持久化数据结构:可以保留每一个历史版本,若所有版本都既可以访问又可以修改,成为完全可持久化(可以回滚到某个历史版本)
时间线:
在这里插入图片描述

可持久化线段树

可持久化下标线段树

题目:

模板 可持久化数组
你需要维护一个长度为N的数组,支持如下几种操作:
1.在某个历史版本上修改某一个位置上的值
2.访问某个历史版本的某一位置的值

做法:

用下标线段树维护一个数组,对于每个版本建一棵线段树->空间O(QN)
用可持久化的思想进行优化
当a[id]的值发生改变时,会影响从根[1,N]–>叶子[id,id]这条链上的所有点,其他点不会被影响,受影响的点只有logN个,所有我们没必要单独再建一个线段树,可以只建新版本的logN个点,其他点与老版本共用
如图,当a[1]发生修改时的情况
在这里插入图片描述
这样我们既保存了旧版本又存下新版本,根节点1(白色)对应旧版本,根节点1(红色)对应新版本,这样保存下所有历史版本,而且空间得到优化
空间O(logN)
时间O(logN)
增加边复杂度为常数

赋值节点的操作

赋值节点时直接用赋值运算符 =

int clone(int rt){top++;tr[top]=tr[rt];return top;
}int update(int rt,int l,int r,int pos,int val){rt=clone(rt);if(l==r){tr[rt].val=val;return rt;}int mid=(l+r)>>1;if(pos<=mid)tr[rt].l=update(tr[rt].l,l,mid,pos,val);else tr[rt].r=update(tr[rt].r,mid+1,r,pos,val);return rt;
}

完整代码


改成我自己风格的可持久化

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
//Fe~Jozky
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
void rd_txt(){#ifdef ONLINE_JUDGE#elsefreopen("in.txt","r",stdin);#endif
}
const int maxn=1e6+9;
int a[maxn];
int top=0;
struct tree{int l,r,val;
}tr[maxn*30];
int clone(int rt){top++;tr[top]=tr[rt];return top;
}
int build(int rt,int l,int r){rt=++top;if(l==r){tr[rt].val=a[l];return rt;}int mid=(l+r)>>1;tr[rt].l=build(tr[rt].l,l,mid);tr[rt].r=build(tr[rt].r,mid+1,r);return rt;
}
int update(int rt,int l,int r,int pos,int val){rt=clone(rt);if(l==r){tr[rt].val=val;return rt;}int mid=(l+r)>>1;if(pos<=mid)tr[rt].l=update(tr[rt].l,l,mid,pos,val);else tr[rt].r=update(tr[rt].r,mid+1,r,pos,val);return rt;
}
int query(int rt,int l,int r,int x){if(l==r)return tr[rt].val;int mid=l+r>>1;if(x<=mid)return query(tr[rt].l,l,mid,x);else return query(tr[rt].r,mid+1,r,x);
}
int Root[maxn];
int main()
{rd_txt();int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}Root[0]=build(0,1,n);for(int i=1;i<=m;i++){int rt,mode,x;scanf("%d%d%d",&rt,&mode,&x);if(mode==1){int y;scanf("%d",&y);Root[i]=update(Root[rt],1,n,x,y);}else {printf("%d\n",query(Root[rt],1,n,x));Root[i]=Root[rt];}}
}

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

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

相关文章

ASP.NET Core中使用GraphQL - 第一章 Hello World

前言你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL。 GraphQL提供了一种声明式的方式从服务器拉取数据。你可以从GraphQL官网中了解到GraphQL的所有优点。在这一系列博客中&#xff0c;我将展示如何在ASP.NET Core中集成GraphQL, 并使用GraphQL作为你的API查询语言。…

11月7日邀您参加成都微软MVP圆桌之夜!

阅读文本大概需要 3.3 分钟。活动背景/规模成都一座来了就不想离开的城市&#xff0c;在此秋高气爽的日子里&#xff0c;我们迎来了成都微软最有价值专家&#xff08;MVP&#xff09;圆桌之夜。在过去的一年中&#xff0c;感谢各位MVP以杰出的专业知识在技术社区中解决了大量的…

Sangmado 公共基础类库

Sangmado&#xff08;发音 /sɔŋmɑːdu:/ ‘桑麻渡’&#xff09;涵盖了支撑 .NET/C# 项目开发的最基础的公共类库&#xff0c;为团队在不断的系统开发和演进过程中发现和积累的最公共的代码可复用单元。Sangmado 公共类库设计原则&#xff1a;独立性&#xff1a;不与任何业务…

【模板】卡特兰数

ACM模板 目录Catalan数证明卡特兰数应用Catalan数证明 1.卡特兰数递推式&#xff1a; an{1,n0∑i0n−1aian−1−i,n>0a_n\begin{cases} 1,n0\\\sum_{i0}^{n-1}a_ia_{n-1-i},n>0\end{cases} an​{1,n0∑i0n−1​ai​an−1−i​,n>0​ 2.卡特兰数组合数&#xff1a; an…

【活动(深圳)DevOps/.NET 微服务 秋季分享会】火热报名中!

无论身处开发还是运维岗位&#xff0c;您一定深刻地感受着业务需求带来的快速交付压力。在科技迅速发展的时代&#xff0c;传统行业积极开展数字化转型以在激烈竞争中脱颖而出&#xff0c;新兴行业不停歇地验证业务模式以找准市场定位&#xff1b;软件与行业变得密不可分&#…

微软正式发布Azure IoT Central

微软正式发布Azure IoT Central&#xff0c;这是一个面向物联网的软件即服务解决方案。借助该服务&#xff0c;微软旨在提供一种设计、开发、配置和管理IoT设备的低代码方式&#xff0c;同时提供开箱即用的安全性、可伸缩性以及与流程&应用程序集成。Azure IoT Central构建…

点分治(树分治)

文章目录介绍&#xff1a;题目&#xff1a;做法&#xff1a;模板题 [P3806 【模板】点分治1](https://www.luogu.com.cn/problem/P3806)代码&#xff1a;介绍&#xff1a; 将原问题分解成若干相同形式&#xff0c;相互独立的子问题&#xff0c;各个击破 一般用来解决有关树上路…

.NET Standard 2.1 公布

原文: Announcing .NET Standard 2.1校对: Cloud自从大约一年前发布 .NET Standard 2.0以来&#xff0c;我们已经向 .NET Core 2.1 发布了两个更新&#xff0c;并即将发布 .NET Core 2.2 。 现在是时候更新 Standard 了&#xff0c;包括一些新的概念以及一些小改进&#xff0c;…

ASP.NET Core中使用GraphQL - 第二章 中间件

前文&#xff1a;ASP.NET Core中使用GraphQL - 第一章 Hello World中间件如果你熟悉ASP.NET Core的中间件&#xff0c;你可能会注意到之前的博客中我们已经使用了一个中间件&#xff0c;这个中间件负责输出了当前查询的结果。中间件的定义&#xff1a;中间件是装载在应用程序管…

ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

本系列相关文章&#xff1a;《ASP.NET Core中Ocelot的使用&#xff1a;API网关的应用》《ASP.NET Core中Ocelot的使用&#xff1a;基于Spring Clound Netflix Eureka的动态路由》本文将基于前两篇文章所述内容&#xff0c;继续介绍如何在服务发现和动态路由的基础上&#xff0c…

POJ2155 - Matrix(二维树状数组)

POJ2155 - Matrix 文章目录题目题解&#xff1a;代码题目 给你一个二维矩阵&#xff0c;初始化为0&#xff0c;然后可以进行两次操作&#xff1a; C:x,y,x1,y2 对该小矩阵内的数进行取反 Q:查询某个点是0还是1 题解&#xff1a; C是区间修改&#xff0c;Q是单点查询&#xf…

.NET Core2使用Azure云上的Iot-Hub服务

基于工业4.0大背景下的工业物联网是近几年内热门的话题&#xff0c;依靠信息化技术企业可以实现数字化转型&#xff0c;生产可以实现智能化制造&#xff0c;设备可以实现自动化运作。然而&#xff0c;海量的数据采集是整个建设过程的基础环节&#xff0c;如何处理与利用这海量的…

SmartCode.ETL 这不是先有鸡还是蛋的问题!

继国庆节 SmartCode 正式版&#xff08;SmartCode.Generator&#xff09;发布之后&#xff0c;SmartCode 迎来了新的能力 SmartCode.ETL !SmartCode 正式版从开始发布就从未说过自己仅仅是个代码生成器&#xff0c;这点上从我第一次宣布SmartCode正式开源的文章就可以说明&…

dubbo线程池为什么耗尽

文章概述 大家可能都遇到过DUBBO线程池打满这个问题&#xff0c;报错如下&#xff0c;本文我们就一起分析DUBBO线程池打满这个问题。 cause: org.apache.dubbo.remoting.RemotingException: Server side(10.0.0.100,20881) thread pool is exhausted, detail msg:Thread pool …

手把手教你写DI_0_DI是什么?

DI是什么&#xff1f;Dependency Injection 常常简称为&#xff1a;DI。它是实现控制反转&#xff08;Inversion of Control – IoC&#xff09;的一个模式。fowler 大大大神 “几十年”前的经典文章 https://www.martinfowler.com/articles/injection.html 说的很清楚。“几十…

C++顺序创建txt文件

今天下午在对拍数据的时候感觉好麻烦。。 一次次手调文件名称&#xff0c;突然想起可以直接写段程序集中操作 顺序输出 #include <iostream> #include <fstream> #include<string> using namespace std;int main () {ofstream File;for(int i0;i<3;i){str…

使用Visual Studio Code开发.NET Core看这篇就够了

在本文中&#xff0c;我将带着大家一步一步的通过图文的形式来演示如何在Visual Studio Code中进行.NET Core程序的开发&#xff0c;测试以及调试。尽管Visual Studio Code的部分功能还达不到Visual Studio的水平&#xff0c;但它实际上已经足够强大来满足我们的日常开发。而且…

手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期

在上一节&#xff1a;手把手教你写DI_2_小白徒手撸构造函数注入浑身绷带的小白同学&#xff1a;我们继续开展我们的工作&#xff0c;大家都知道 Singleton是什么&#xff0c;就是全局只有一个呗&#xff0c;我们就先从它开始&#xff0c;这个多简单&#xff0c;我们找个字典放这…

手把手教你写DI_2_小白徒手撸构造函数注入

在上一节&#xff1a;手把手教你写DI_1_DI框架有什么&#xff1f;我们已经知道我们要撸哪些东西了那么我们开始动工吧&#xff0c;这里呢&#xff0c;我们找小白同学来表演下小白同学 &#xff1a;我们先定义一下我们的广告招聘纸有什么&#xff1a;好&#xff0c;我们实现两种…

服务器win2008 R2 x64 部署ASP.net core到IIS 并解决 HTTP Error 502.5 的问题

1、发布网站 &#xff1b;2、安装 vc_redist.x64 (Visual C Redistributable for Visual Studio 2015) 新装的系统没装的补丁&#xff0c;装过略过&#xff1b;3、安装WindowsHosting &#xff1a;如&#xff1a; dotnet-hosting-2.1.3-win &#xff1b;4、安装.Net Core SDK&…