首页 > 其他分享 >主席数学习笔记

主席数学习笔记

时间:2024-07-23 14:52:46浏览次数:14  
标签:int tr cin 笔记 mid 学习 now root 主席

笛卡尔树太难了啊。

主席树

可持久化数据结构 \((\text {Persistent data structure)}\) 总是可以保留每一个历史版本,并且支持操作的不可变特性 \(\text{(immutable)}\)。

意思就是可以查询历史值,对于每一个历史版本 \(k\),都是经过第 \(k-1\) 个版本、修改重连 \(\log n\) 个节点实现的。

image

如图,修改了 \([1,8]\) 中对应权值为 1 的结点,红色的点即为更改的点

只更改了 \(\log n\) 个结点,形成一条链,也就是说每次更改的结点数 = 树的高度。

注意主席树不能使用堆式存储法,就是说不能用 \(x\times 2,x\times 2+1\) 来表示左右儿子,而是应该动态开点,并保存每个节点的左右儿子编号。

所以我们只要在记录左右儿子的基础上,保存插入每个数的时候的根节点就可以实现持久化了。

例题

P3919 【模板】可持久化线段树 1

模板,单点修改单点查询的主席树。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+4;
int a[N];
int root[N];
int cnt;
struct PST{
	struct node{
		int ls,rs,val;
	}tr[N<<5];
	#define lid tr[now].ls
	#define rid tr[now].rs
	void build(int &now,int l,int r)
	{
		now=cnt++;
		if(l==r)
		{
			tr[now].val=a[l];return ;
		}
		int mid=(l+r)>>1;
		build(lid,l,mid),build(rid,mid+1,r);
	}
	void update(int pre,int &now,int l,int r,int &x,int &y,int &val)
	{
		now=cnt++;
		tr[now]=tr[pre];
		if(x<=l&&r<=y) 
		{
			tr[now].val=val;return ;
		}
		int mid=(l+r)>>1;
		if(x<=mid) update(tr[pre].ls,lid,l,mid,x,y,val);
		if(y>mid) update(tr[pre].rs,rid,mid+1,r,x,y,val);
	}
	int query(int now,int l,int r,int x,int y)
	{
		if(x<=l&&r<=y) return tr[now].val;
		int mid=(l+r)>>1;
		if(x<=mid) return query(lid,l,mid,x,y);
		if(y>mid)return query(rid,mid+1,r,x,y);
	}
}st;int n,m;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	st.build(root[0],1,n);
	for(int i=1;i<=m;i++)
	{
		int  v,op,x,y;cin>>v>>op;
		if(op==1)
		{
			cin>>x>>y;
			st.update(root[v],root[i],1,n,x,x,y);
		}
		else
		{
			cin>>x;
			int ans=st.query(root[v],1,n,x,x);
			root[i]=root[v];
			cout<<ans<<"\n";
		}
	}
}

P1652 可持久化线段树

把上面的码变一下,修改的时候再新建版本,其余不要动,加上区间查询即可。

标签:int,tr,cin,笔记,mid,学习,now,root,主席
From: https://www.cnblogs.com/ccjjxx/p/-/PST

相关文章

  • C4D2024软件下载+自学C4D 从入门到精通【学习视频教程全集】+【素材笔记】
    软件介绍与下载:链接:链接:https://pan.baidu.com/s/1n8cripcv6ZTx4TBNj5N04g?pwd=hfg5 提取码:hfg5 基础命令的讲解:掌握软件界面和基础操作界面。学习常用的基础命令,如建模、材质、灯光、摄像机等的基本设置和调整。注意快捷键的使用,可以安装插件来显示快捷键。建模案例......
  • 嵌入式学习之USB协议(二)
    上一节我们讲了USB的电气信号,今天我们讲帧的组成内容;请注意,USB通信中的“帧”相当于串口通信中的“字节”。在常见的串口,I2C,SPI等等,均以字节为单位,通过分析字节组成的数据得到信息;USB以帧为单位,通过帧组成的数据得到信息,不完整的帧组成的信息没有任何意思,直接丢弃。帧的组......
  • PR速成教程+系统课程零基础学习视频百度云盘分享
    如大家所了解的,PR全称AdobePremiere,是一款专业的视频编辑软件。它是一款桌面端软件,支持Windows和MacOS操作系统。PR作为一款流行的视频编辑工具,被广泛应用于电影、电视、广告、纪录片等领域的视频制作中。下面总结一些Pr软件的常用功能,以便初学者参考、学习:1、视频剪辑(也......
  • django学习入门系列之第四点《案例 走马灯(让字幕滚动)》
    文章目录往期回顾<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><spanid="txt">欢迎中国联通领导过来指导</span><scri......
  • java学习day01
    一.java安装1.1安装java1.81.2java内创建文件夹jdk和jre分别安装java的jdk和jre1.3环境变量JAVA_HOMEE:\work\java\jdk(自己电脑的文件位置)CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Path内增加%JAVA_HOME%\bin(上移到最上方)二.java2.1......
  • java学习day02
    一.数据类型1.1本质数据存储形式,存储空间大小1.2存储整数存储:1.3分类基本数据类型数值型整型byte字节8bit-128~127short短整型16bit-32768~32767int整型32bit-2,147,483,648~2,147,483,647long长整型64bit浮点型float单浮点32bitdouble双浮......
  • 【笔记】学术英语写作
    小学期修了学术英语写作,老师是我们数分三的老师(啊这)。以下是课堂笔记汇总analogy类比constitute组成attenuate减少convention公约referee审阅sanitycheckOverview完整。把数学符号翻译成英文后,行文应当符合英文语法。简洁。Don'tshow.逻辑。Motivation。......
  • 快速学习一个算法,Transformer
    今天给大家介绍一个强大的算法模型,TransformerTransformer模型是由Vaswani等人在2017年提出的一种用于自然语言处理的深度学习模型,特别擅长于处理序列到序列的任务,如机器翻译、文本生成等。今天,我们主要从编码的角度来进行说明。Transformer模型架构Transformer......
  • 框架学习 | Streamlit 入门
    一、表格importstreamlitasstimportpandasaspdst.title("我的个人网站......
  • 第十四天笔记(外键)
    数据库之外键==========================、一、外键的介绍1、外键的定义让一张表记录的数据不要太过于冗余,在数据库中对表的关系进行解耦,尽量让表的数据单一化。2、外键的作用保持数据的一致性和完整性3、msyql数据库中的存储引擎?myisam(默认)innodb(外键需要用到inno......