首页 > 其他分享 >20230630-可持久化数据结构 2

20230630-可持久化数据结构 2

时间:2023-07-19 22:55:56浏览次数:38  
标签:pre ch 持久 val int tr maxn 20230630 数据结构

20230630

P3919 【模板】可持久化线段树 1(可持久化数组)

题目大意

传送门
题目已经说得很清楚了

Solution

一道可持久化线段树的板子题
注意数组开大一点!!!

H_W_Y-Coding
#include <bits/stdc++.h>
using namespace std;

const int maxn=2e6+10;//开大一点
int n,m,a[maxn],rt[maxn],tot=0,op,x,val,p;
struct  seg{
  int val,ch[2];
}tr[maxn<<4];

namespace SGT{
  #define lc tr[p].ch[0]
  #define rc tr[p].ch[1]
  inline void build(int &p,int l=1,int r=n){
  	p=++tot;
  	if(l==r){
  	  tr[p].val=a[l];
	  return ;	
	}
	int mid=l+((r-l)>>1);
	build(lc,l,mid);
	build(rc,mid+1,r);
  }
  inline void update(int &p,int pre,int x,int val,int l=1,int r=n){
  	p=++tot;
  	tr[p].val=tr[pre].val;
  	tr[p].ch[0]=tr[pre].ch[0];
  	tr[p].ch[1]=tr[pre].ch[1];
  	if(l==r){
	  tr[p].val=val;
	  return ;  
	}
	int mid=l+((r-l)>>1);
	if(x<=mid) update(lc,tr[pre].ch[0],x,val,l,mid);
	else update(rc,tr[pre].ch[1],x,val,mid+1,r);
  }
  inline int query(int p,int x,int l=1,int r=n){
  	if(l==r) return tr[p].val;
  	int mid=l+((r-l)>>1);
    if(x<=mid) return query(lc,x,l,mid);
    else return query(rc,x,mid+1,r);
  }
}
using namespace SGT;

int main(){
  /*2023.7.6 H_W_Y P3919 【模板】可持久化线段树 1(可持久化数组) 可持久化线段树*/ 
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  build(rt[0]);
  for(int i=1;i<=m;i++){
  	scanf("%d%d",&p,&op);
  	if(op==1){
  	  scanf("%d%d",&x,&val);
	  update(rt[i],rt[p],x,val);
	}
	else{
	  scanf("%d",&x);
	  printf("%d\n",query(rt[p],x));
	  rt[i]=++tot;
	  tr[rt[i]]=tr[rt[p]];
	}
  }
  return 0;
}

P3834 【模板】可持久化线段树 2

题目大意

传送门
题目已经说得很清楚了

Solution

第二道板子题

H_W_Y-Coding
#include <bits/stdc++.h>
using namespace std;

const int maxn=2e5+10;
int n,a[maxn],b[maxn],l,r,k,m,rt[maxn],tot=0,len=0;
struct seg{
  int val,ch[2];
}tr[maxn<<4];

namespace SGT{
  #define lc tr[p].ch[0]
  #define rc tr[p].ch[1]
  inline void update(int &p,int pre,int x,int l=0,int r=len){
  	p=++tot;
  	tr[p].val=tr[pre].val+1;
  	tr[p].ch[0]=tr[pre].ch[0];
  	tr[p].ch[1]=tr[pre].ch[1];
  	if(l==r) return ;
  	int mid=l+((r-l)>>1);
  	if(x<=mid) update(lc,tr[pre].ch[0],x,l,mid);
  	else update(rc,tr[pre].ch[1],x,mid+1,r);
  }
  inline int query(int p,int pre,int x,int l=0,int r=len){
  	if(l==r) return l;
  	int mid=l+((r-l)>>1),cnt=tr[lc].val-tr[tr[pre].ch[0]].val;
  	if(x<=cnt) return query(lc,tr[pre].ch[0],x,l,mid);
	else return query(rc,tr[pre].ch[1],x-cnt,mid+1,r); 
  }
}
using namespace SGT;

int main(){
  /*2023.7.6 H_W_Y P3834 【模板】可持久化线段树 2 可持久化线段树*/ 
  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);
  len=unique(b+1,b+n+1)-b-1;
  for(int i=1;i<=n;i++) update(rt[i],rt[i-1],lower_bound(b+1,b+len+1,a[i])-b);
  for(int i=1;i<=m;i++){
  	scanf("%d%d%d",&l,&r,&k);
  	printf("%d\n",b[query(rt[r],rt[l-1],k)]);
  }
  return 0;
}

标签:pre,ch,持久,val,int,tr,maxn,20230630,数据结构
From: https://www.cnblogs.com/hewanying0622/p/17525653.html

相关文章

  • 数据结构与算法 头歌 图的拓扑排序算法
    数据结构与算法之图的拓扑排序算法导言拓扑排序是对有向无环图(DirectedAcyclicGraph,DAG)进行排序的一种算法。在实际开发中,拓扑排序算法常用于解决任务调度、编译顺序等问题。本文将介绍拓扑排序算法的实现过程,并帮助初学者理解该算法的原理及代码实现。拓扑排序流程以下......
  • C/C++数据结构课程设计题目[2023-07-19]
    C/C++数据结构课程设计题目[2023-07-19]数据结构课程设计题目基本要求:1、每人1题,如果系统具有界面以及功能复杂,可以2人合作一题。2、可以自拟题目,难度不低于给定题目,且自拟的题目需要经过老师审核通过。3、要求实现一个界面美观、功能完整、具有实用性的系统。4、不限制......
  • 数据结构--二叉平衡树
    二叉平衡树回顾:二叉排序树的查找二叉排序树的不平衡会影响查找效率,所有我们要尽量让二叉树的形态均衡.AVL树(平衡二叉树)必须是二叉排序树左子树和右子树的高度之差的绝对值小于等于1左子树和右子树也是平衡二叉排序树平衡因子该结点左子树与右子树的高度差.平......
  • 数据结构与算法:图有哪些关键核心知识点
    图是一种复杂的数据结构,它由顶点和边组成,可以表示任意两个数据元素之间的关系。图有以下一些基本概念和术语:图可以分为无向图和有向图,根据边是否有方向。图可以分为简单图和多重图,根据边是否重复或自环。图可以分为完全图和非完全图,根据任意两个顶点之间是否存在边或弧。图......
  • 数据结构刷题
    山理工数据结构刷题专题1--顺序表专题2--栈和队列专题3--串和数组专题4--二叉树专题5--二叉查找树和平衡二叉树树结构练习——排序二叉树的中序遍历#include<bits/stdc++.h>#defineyescout<<"YES"<<'\n'#defineno cout<<"NO"<<'\n'usingnamespace......
  • 数据结构练习笔记——删除单链表中相同元素
    删除单链表中相同元素【问题描述】单链表中存放了若干整数,请删除相同整数。【输入形式】单链表【输出形式】删除相同整数后的单链表【样例输入】11123【样例输出】123【样例说明】递增的形式输入数据,允许相同元素#include<stdlib.h>#include<iostream>usingname......
  • 哈希数据结构
    参考链接:https://blog.csdn.net/CRMEB/article/details/1208206821.哈希表哈希表,即散列表(Hashtable),是根据keyvalue而直接进行访问的数据结构。也就是说,它通过把keyvalue映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。......
  • 数据结构
    数据结构中的基本概念  数据:任何能够输入到计算机中,能被程序处理的描述客观事物的符号  数据项:有独立含义的最小单位,也叫做数据域、域  数据元素:组成数据的、有一定意义的基本单位,也叫作节点、结点、顶点(一个数据元素是由若干项数据项组成)  数据结构:相互之间......
  • 7.17 数据结构
    线段树小白逛公园动态维护最大子段和,没啥好说的文文的摄影布置考虑清楚标记分讨合并算术天才⑨与等差数列维护区间最大最小,如果是等差数列,有了端点就可以知道整个序列了,再维护哈希值对比就可以了,突然发现我之前这个解法是乱搞,只有充分性没有必要性,只是题目没有卡正解:维护......
  • 数据结构小记
    线段树区间查询线段树可以维护具有结合律的信息。区间修改区间查询加上修改后应当满足的前提是我们可以维护一个封闭的集合\(\mathcal{S}\),使得任一操作\(o\in\mathcal{S}\),且\(\mathcal{S}\)对于复合封闭,即对任意\(u,v\in\mathcal{S}\),有\(u\circv\in\mathcal{S}\)......