首页 > 其他分享 >可持久化线段树

可持久化线段树

时间:2022-11-16 15:14:24浏览次数:51  
标签:ch 持久 rs int 线段 tag

可持久化线段树

可持久化数据结构总是可以保留每一个历史版本,并且支持操作的不可变特性
部分可持久化 所有版本都可以访问,但是只有最新版本可以修改
完全可持久化 所有版本都既可以访问又可以修改,支持将两个历史版本合并

主席树&可持久化线段树
主席树全称:可持久化权值线段树
函数式线段树:是指使用函数式编程思想的线段树,函数式线段树是[完全可持久化]的

先上动态开点:

//动态开点线段树模板 就是不用x*2与x*2+1记录左右儿子,直接用cnt记录编号以及对应l、r,减少4倍空间的超大消耗
#include<bits/stdc++.h>
#define ls a[o].l
#define rs a[o].r
using namespace std;

const int N=15000010;

int read() {

	int x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57) {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57) {
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;

}

struct Dyk {

	int l,r;

} a[N];

int sum[N],tag[N],cnt=0,root;

void push_up(int o) {
	sum[o]=sum[ls]+sum[rs];
}

void push_down(int o,int l,int r) {

	if(tag[o]!=-1) {

		int mid=(l+r)>>1;
		if(!ls) ls=++cnt;
		if(!rs) rs=++cnt;
		sum[ls]=tag[o]*(mid-l+1);
		sum[rs]=tag[o]*(r-mid);
		tag[ls]=tag[o];
		tag[rs]=tag[o];
		tag[o]=-1;

	}

}

void update(int &o,int l,int r,int x,int y,int k) {

	if(o==0) o=++cnt;
	if(x<=l&&r<=y) {
		sum[o]=(r-l+1)*k;
		tag[o]=k;
		return ;
	}

	push_down(o,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) update(ls,l,mid,x,y,k);
	if(y>mid)  update(rs,mid+1,r,x,y,k);
	push_up(o);

}

int query(int o,int l,int r,int x,int y) {
	
	int ans=0;  
	if(o==0) return 0;
	if(l==x&&r==y) return sum[o];
	int mid=(l+r)>>1;
	if(y<=mid) ans+=query(ls,l,mid,x,y);
	if(x>mid) ans+=query(rs,mid+1,r,x,y);
	return ans;
	
}


int n,q;

int main() {

	n=read();
	q=read();
	memset(tag,-1,sizeof(tag));
	update(root,1,n,1,n,0);
	for(int i=1; i<=q; i++) {

		int x=read(),y=read(),k=read();
		update(root,1,n,x,y,2-k);
		printf("%d\n",n-sum[1]);

	}

	return 0;
}

······

标签:ch,持久,rs,int,线段,tag
From: https://www.cnblogs.com/Diamondan/p/16895952.html

相关文章

  • RabbitMq消息手动应答,放回队列重新消费,设置队列消息持久化
    RabbitMq消息手动应答,放回队列重新消费,设置队列消息持久化消息手动应答:编写获取信道工具类/***@authorzjh*/publicclassRabbitMqUtils{publicstatic......
  • Vuex 数据持久化(vuex-persistedstate)
    使用conststore=newVuex.Store({modules:{user:{},},getters,actions,//异步mutations,//同步plugins:[createPersistedState({......
  • Vuex 持久化数据更新(vuex-persistedstate)
    在Vuex的使用过程中,会面临数据持久化问题,如:用户数据、菜单数据、必要的信息数据等。遇到问题:改变数据后F5刷新页面,数据不改变使用方式exportdefault{mounted......
  • 【XSY4829】鸽子的彩灯(线段树)
    大强说很套路,所以记一下。首先当前的电流就是剩下还未经过的点亮的灯的\(c_i\)之和。考虑一个暴力的做法:初始将所有询问的流量设为\(0\),从后往前扫过每一个彩灯\(i\)......
  • 可持久化线段树 学习笔记
    引入嗯嗯因为我打了一次测试所以学了这个可持久化线段树(怎么说其实这东西我很久之前学过,只是有点忘了深刻认识到了写博客的重要性啦!(>ω・*)ノ这东西其实很简单,也加强了......
  • redhat持久化日志与实战练习
    持久化日志默认情况下,RedHatEnterpriseLinux7将系统日志存储在/run/log/journal中,该日志存储在tmpfs(临时文件系统)上。这意味着在重新启动时,所有存储的信息都将丢失。如......
  • 线段树维护区间历史版本和
    好久没写博客了,主要是这玩意网上有点难搜到,就干脆糊了一个另外区间加操作的题见这个博客给定长为\(n\)的01序列,\(m\)个询问,第\(i\)次认为产生一个新版本\(i\);要......
  • 20221111_T1B_线段树优化建图/并查集
    题意给定一个字符串,其中只有a和b,现在一个字符能够跳到与之中间a的个数范围在\([l,r]\)的东西。题解赛时得分:100/100对于一个东西,显然如果将能相互到达连边,那么......
  • 可持久化线段树
    可持久化线段树可持久化权值线段树·又叫主席树·本质就是多棵线段树·可持久化表示可以维护历史任一版本的数据·例题\(\quad\)·Q1:给定\(n\)个整数构成的......
  • 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(PV&PVC)
    使用Kubeadm部署Kubernetes(K8S)安装--持久化存储(NFS网络存储)NFS存在一个弊端,需要知道NFS服务器的地址,配在yaml中PV:持久化存储,对存储资源进行抽象,对外提供可......