数据结构----主席树

可持久化线段树(主席树) 摘要 主席树,又称可持久化线段树,属于可持久化数据结构。“主席”这一名词是由于发明者缩写为HJT,和某位主席拼音缩写相同(有些牵强),故将该数据结构称为主席树。 主席树既保留了线段树的灵活,也拥有了可持久化数据结构的特点,在处理某些特定问题时有着其它数据结构不具有的优势。 本文将首先介绍什么是“可持久化数据结构”,随后介绍主席树的思想,关于代码实现将结合例题讲解。 可持久化数据结构 可持久数据结构... 阅读详情

这两天一直在看各种树~划分树,左偏树,主席树,伸展树~~~好乱~~


一听到主席树这个名字的时候感觉好奇怪,为什么会叫主席树,感觉好难好高大上,所以一直敬而远之,,,,,主席树是一个大牛的拼音缩写HJT(hu jingtao),额~~大牛就是厉害!!!


昨晚上bili发现了一个主席树视频,突然感觉好开心,终于有教程了,哈哈哈~~~发现up主还上传了其他 的算法教程,,,,于是叫注册了bili账号还百度通过了正式会员~~

哈哈~~本来以为b站考试很难,,的确很难(因为之前听朋友说她好艰难才通过、的),但是有百度这种东西~~今天看了up主关于主席树的讲解,虽然明白主席树的什么,但是要手动实现就不会了,看了up的代码好久才渐渐明白,up主的代码好短而已,但是技巧之类的好多,特别是到递归,我觉得递归真的好恶心,因为很难捕捉一下就跳到哪里去了,特别是带返回值的。。。。。后来又看了kuangbin的代码,自己又写了一遍,但是Kuangbin的不是递归写的,而我改成了递归的,不知为什么感觉有点成就感,哈哈~至少对代码的理解又加深了一点点。,,好怕过两天就忘的一干二净了,。。


进入正题:

up主连接:主席树       (一开始是通过up的视频学的)

下面是摘抄其他人的:

主席树的主体是线段树,准确的说,是很多棵线段树,存的是一段数字区间出现次数(所以要先离散化可能出现的数字)。举个例子,假设我每次都要求整个序列内的第 k 小,那么对整个序列构造一个线段树,然后在线段树上不断找第 k 小在当前数字区间的左半部分还是右半部分。这个操作和平衡树的 Rank 操作一样,只是这里将离散的数字搞成了连续的数字。

先假设没有修改操作:

对于每个前缀 S1…i,保存这样一个线段树 Ti,组成主席树。这样不是会 MLE 么?最后再讲。

注意,这个线段树对一条线段,保存的是这个数字区间的出现次数,所以是可以互相加减的!还有,由于每棵线段树都要保存同样的数字,所以它们的大小、形态也都是一样的!这实在是两个非常好的性质,是平衡树所不具备的。

对于询问 (i,j),我只要拿出 Tj 和 Ti-1,对每个节点相减就可以了。说的通俗一点,询问 i..j 区间中,一个数字区间的出现次数时,就是这些数字在 Tj 中出现的次数减去在 Ti-1 中出现的次数。

那么有修改操作怎么办呢?

如果将询问看成求一段序列的数字和,那么上面那个相当于求出了前缀和。加入修改操作后,就要用树状数组等来维护前缀和了。于是那个 “很好的性质” 又一次发挥了作用,由于主席树可以互相加减,所以可以用树状数组来套上它。做法和维护前缀和长得基本一样,不说了。

这段指出了主席树的主要性质。。

  • 线段树的每个结点,保存的是这个区间含有的数字的个数。
  • 主席树的每个结点,也就是每颗线段树的大小和形态也是一样的,也就是主席树之间可以相互进行加减运算。。

同时我们也枚举一下主席树的一些局限:

  • 主席树是一种离线结构。。(必须预先知道所有数字的范围。。这在一些应用中会成为障碍。。。
  • 存在 MLE 问题。。(如果按照定义里面的方法去写,对每个结点都需要开一整可线段树,至少都是 O(n2) 级别的空间。。

——————————————————
开始填坑。由于每棵线段树的大小形态都是一样的,而且初始值全都是 0,那每个线段树都初始化不是太浪费了?所以一开始只要建一棵空树即可。

然后是在某棵树上修改一个数字,由于和其他树相关联,所以不能在原来的树上改,必须弄个新的出来。难道要弄一棵新树?不是的,由于一个数字的更改只影响了一条从这个叶子节点到根的路径,所以只要只有这条路径是新的,另外都没有改变。比如对于某个节点,要往右边走,那么左边那些就不用新建,只要用个指针链到原树的此节点左边就可以了,这个步骤的前提也是线段树的形态一样。

假设s是数字个数,这个步骤的空间复杂度显然是 O(logs)。用树状数组去套它,共有 2logn 棵树被修改,m 个操作再加上一开始的空树和 n 个数字,总共就是 O((n+m)lognlogs)。Fotile 大神说如果加上垃圾回收的话,可以去掉一个 log…… ym

poj 2104 k-th number

这题也可以用划分树(见上一篇)

代码1:up主  代码2: kuangbin修改版     代码3:kuangbin

版本1

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=1e5+6;
int n,m,cnt=0,root[maxn],a[maxn],x,y,k;
struct node{
	int l,r,sum;
}T[maxn*40];
vector<int>v;

int getid(int x)  {
	return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}

void update(int l,int r,int &x,int y,int pos){
	T[++cnt]=T[y],T[cnt].sum++,x=cnt;
	if(l==r) return ;
	int mid=(l+r)/2;
	if(mid>=pos) update(l,mid,T[x].l,T[y].l,pos);
	else update(mid+1,r,T[x].r,T[y].r,pos);
}

int query(int l,int r,int x,int y,int k){
	if(l==r) return l;
	int mid=(l+r)/2;
	int sum=T[T[y].l].sum-T[T[x].l].sum;
	if(sum>=k) return query(l,mid,T[x].l,T[y].l,k);
	else return query(mid+1,r,T[x].r,T[y].r,k-sum);
}
int main() {

    #ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),v.push_back(a[i]);
	sort(v.begin(),v.end());
	/*unique只是把重复的元素放到容器的后面,而它本身会返回一个迭代器,
	只向这些元素的开始部分。因此要向真正删除这些元素,
	还是要“手工”处理一下。可以用vector的erase*/
	v.erase(unique(v.begin(),v.end()),v.end());       //去重
	for(int i=1;i<=n;i++) update(1,n,root[i],root[i-1],getid(a[i]));
	//for(int i=0;i<=n;i++) cout<<root[i]<<" ";
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&k);
		printf("%d\n",v[query(1,n,root[x-1],root[y],k)-1]);
	} 
	
}                        

版本2

#include<cstdio>
#include<iostream>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;
const int maxn=1e5+10;
const int N=maxn*30;
int n,q,m,tot;
int a[maxn],t[maxn];
int T[N],ls[N],rs[N],c[N];

void init()
{
	for(int i=1;i<=n;i++)
	t[i]=a[i];
	sort(t+1,t+n+1);
	/*
	在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),
	其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,
	然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,去重后最后一个元素的下一个地址 
	因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。
	*/
	m=unique(t+1,t+n+1)-t-1;
}

int build(int l,int r)
{
	int root=tot++;
	c[root]=0;
	if(l!=r)
	{
		int mid=(l+r)/2;
		ls[root]=build(l,mid);
		rs[root]=build(mid+1,r);
	}
	return root;
}

int hash(int x)
{
	return lower_bound(t+1,t+1+m,x)-t;   //返回下标 
} 

int update(int root,int pos,int val,int l,int r)
{
	int newroot=tot++,tmp=newroot;
	c[newroot]=c[root]+val;
	if(l==r) return 1;
	int mid=(l+r)/2;
	if(pos<=mid)
	{
		ls[newroot]=tot;rs[newroot]=rs[root];
		update(ls[root],pos,val,l,mid);
	}
	else
	{
		rs[newroot]=tot;ls[newroot]=ls[root];
		update(rs[root],pos,val,mid+1,r);
	}
	return tmp;
} 

int query(int l,int r,int x,int y,int k)
{
	int mid=(l+r)/2;
	if(l==r) return l;
	int sum=c[ls[y]]-c[ls[x]];
	if(sum>=k)
	{
		query(l,mid,ls[x],ls[y],k);
	}
	else
	query(mid+1,r,rs[x],rs[y],k-sum);
}
int main(){

#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    scanf("%d%d",&n,&q);
    tot=0;
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    init();
    T[n+1]=build(1,m);
    //cout<<T[0]<<endl;
    for(int i=1;i<=n;i++)
    {
    	int pos=hash(a[i]);
    	T[i]=update(T[i-1],pos,1,1,m);
    	//cout<<T[i]<<" ";
	}
	//cout<<endl;
	while(q--)
	{
		int l,r,k;
	    scanf("%d%d%d",&l,&r,&k);
	    printf("%d\n",t[query(1,m,T[l-1],T[r],k)]);
	 } 
    
     
}

版本3

/* ***********************************************
Author        :kuangbin
Created Time  :2013-9-4 20:13:20
File Name     :POJ2104.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

const int MAXN = 100010;
const int M = MAXN * 30;
int n,q,m,tot;
int a[MAXN], t[MAXN];
int T[M], lson[M], rson[M], c[M];

void Init_hash()
{
    for(int i = 1; i <= n;i++)
        t[i] = a[i];
    sort(t+1,t+1+n);
    m = unique(t+1,t+1+n)-t-1;
}
int build(int l,int r)
{
    int root = tot++;
    c[root] = 0;
    if(l != r)
    {
        int mid = (l+r)>>1;
        lson[root] = build(l,mid);
        rson[root] = build(mid+1,r);
    }
    return root;
}
int hash(int x)
{
    return lower_bound(t+1,t+1+m,x) - t;
}
int update(int root,int pos,int val)
{
    int newroot = tot++, tmp = newroot;
    c[newroot] = c[root] + val;
    int l = 1, r = m;
    while(l < r)
    {
        int mid = (l+r)>>1;
        if(pos <= mid)
        {
            lson[newroot] = tot++; rson[newroot] = rson[root];
            newroot = lson[newroot]; root = lson[root];
            r = mid;
        }
        else
        {
            rson[newroot] = tot++; lson[newroot] = lson[root];
            newroot = rson[newroot]; root = rson[root];
            l = mid+1;
        }
        c[newroot] = c[root] + val;
    }
    return tmp;
}
int query(int left_root,int right_root,int k)
{
    int l = 1, r = m;
    while( l < r)
    {
        int mid = (l+r)>>1;
        if(c[lson[left_root]]-c[lson[right_root]] >= k )
        {
            r = mid;
            left_root = lson[left_root];
            right_root = lson[right_root];
        }
        else
        {
            l = mid + 1;
            k -= c[lson[left_root]] - c[lson[right_root]];
            left_root = rson[left_root];
            right_root = rson[right_root];
        }
    }
    return l;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(scanf("%d%d",&n,&q) == 2)
    {
        tot = 0;
        for(int i = 1;i <= n;i++)
            scanf("%d",&a[i]);
        Init_hash();
        T[n+1] = build(1,m);
        for(int i = n;i ;i--)
        {
            int pos = hash(a[i]);
            T[i] = update(T[i+1],pos,1);
        }
        while(q--)
        {
            int l,r,k;
            scanf("%d%d%d",&l,&r,&k);
            printf("%d\n",t[query(T[l],T[r+1],k)]);
        }
    }
    return 0;
}

这题的无修改查询的,有修改查询的需要套树状数组,见下一篇

连接:

主席树 | | 可持久化线段树 - L__J

个人对主席树算法的理解


XILINX RFSoC全面解析(五)—— Zynq UItrascale+ RF Data Converter IP核详解 这期我们来看看RFSoC独有的IP核——Zynq UItrascale+ RF Data Converter如何使用。 我使用的VIVADO版本是2018.3,这个是最低版本,要开发RFSoC,VIVADO版本必须不低于2018.3。 另外电脑配置也需要很高,64位,8核@3.4GHz CPU,16GB内存,固态硬盘基本就是低配,跑起来很勉强。建议有条件的朋友使用工作站或者服务器。 首先在VIVADO中新建一个工程,因为我使用的是xilinx官方的开发板,所以可以直接设定选board就行。 在I 阅读详情

相关推荐

ESP32S3电池电量监测实战:从分压电路到IDF组件配置(附GitHub源码)

本文详细介绍了ESP32S3电池电量监测的完整实战方案。从硬件分压电路的电阻选型、滤波设计,到软件层面利用ESP-IDF的ADC校准机制提升精度,并重点讲解了如何集成bat_monitor开源组件快速实现电压采集、电量计算、充电检测与事件通知。文章提供了从原理到调试的完整指南和GitHub源码,帮助开发者构建稳定可靠的物联网设备电源管理系统。

ee345的博客 530

主席树详解(基础)

可持久化线段树,又称主席树,本文详解它的构成和基础用法

nxhx_的博客 4661

sid图像数据_遥感影像数据

影像数据基本概念影像数据是由卫星或飞机上的成像系统获得的影像,多为遥感影像数据。影像数据的每个像元都有一个值,表示传感器探测到像素对应地面面积上目标物的电磁辐射强度,也叫亮度值、灰度值。SuperMap支持的影像数据格式有:*.img、*.tif、*.tiff、*.bmp、*.jpg、*.png、*.gif、*.raw、*.sid等。计算机以二进制记录数据,所以其量化的等级以二进制来划分,即2n。...

weixin_39534395的博客 1626

主席树

主席树主要解决的问题就是区间第K小数的问题。 主席树为什么叫主席树呢? 因为发明它的folite被我们叫做folite主席,所以就叫主席树。主席树也叫做可持久化线段树,因为其中的每一颗树都是一颗权值线段树,可持久化就是他可以保存的历史版本,因为线段树每次修改只会修改一个点或者一条链的信息。 当确定了元素个数n,或者key的范围[1,U],建出的线段树形态是唯一的。 对两棵key的上界相同的线段树进...

邵光亮的博客 1666

Discrete Optimization (Coursera) 学习笔记 Week 1 introduction (开个帖子)

Week 1 Introduction 这位教授Pascal Van Hentenryck 真的算是优化领域神级别的人物了吧?截一张Google scholar的图大家感受一下… 居然在Coursera上看到了他开的课:Discrete Optimization。试听了几节后,发现讲得很有激情,而且深入浅出。遂决定花暑假跟完这一门课。 这门课每周花两三个小时介绍基础概念,然后得花十几个小时写作业(coding)… 一开始以为Coursera上的课的作业应该不会太难,然后第一次作业(knapsack)我就被

ZJ_11701的博客 657

VINS-Fusion实战:从零搭建无人机视觉SLAM系统(附ROS配置全流程)

本文详细介绍了如何从零开始为无人机搭建基于VINS-Fusion的视觉SLAM系统。内容涵盖硬件选型(重点推荐双目相机与IMU搭配)、ROS环境配置、传感器标定、核心参数调优以及实际飞行测试与问题排解全流程,旨在帮助开发者实现稳定、精确的无人机自主定位与导航。

wasm7browser的博客 214

可持久化线段树【主席树】详解

首先科普下为什么叫主席树呢,这是因为主席树的创始人是一位叫做黄嘉泰的大佬,然后这位大佬名字的缩写是HJT,和某位伟人的名字缩写一样....haha,所以就有了主席树这个说法啦。 其实网上已经有很多博主写了关于主席树详解的博客了,但是我自己为什么还要手敲这样一份主席树教学呢?因为我在刚学主席树的时候,也是看了很多博主写的入门教程,但是没有任何单独一份就能让我搞明白什么是主席树,让我吃了很多苦头,所...

KnightHONG的博客 1795

Label Studio + SAM2分割半自动标注与yolo11训练

Label Studio + SAM2分割半自动标注与yolo11训练

schFallingCloud 1408

详解——主席树

由来 主席树又称函数式线段树,顾名思义,也就是通过函数来实现的线段树 然而我并不知道什么是函数式线段树,某位大爷说:“主席树与可持...

weixin_30657541的博客 388

使用单片机和电流互感器对非正弦周期电流有效值测定

使用单片机和电流互感器,利用一种高速采样的方法来进行有效值测定

月光绿叶滴水音乐 3945

ABAQUS二次开发中创建SET

在ABAQUS中创建加载、边界条件时,需要使用set,创建set时需要使用对象集合对象中的Set函数,这个函数需要提供加入对象集合的列表,但这个对象列表好像并不能自行创建,只能通过ABAQUS各类对象集合中的findAt、getSequenceFromMask、getByBoundingSphere、getByBoundingCylinder或getByBoundingSphere函数得到,但这几个函数在直接使用PYTHON编程时都不太好用。这个函数返回一个字典,如下所示。

hohoyu的专栏 2482

数据结构——静态主席树(主席树第一部分)

定义 可持久化线段树。据说是某大佬学不会划分树,所以自己研究出了这一更为高效的算法(不愧是大佬,%%%)。由于主席树博大精深,这里分成几种类型的主席树分别讨论(无修改,维护修改)。 作用 查询区间内某个数出现次数、查找区间第kkk大值。 原理 学主席树,首先要学会权值线段树。权值线段树的概念比较基础。我给你一个数组aaa,你统计出这个数组里有那些数,排个序,再另开一个数组bbb储存这些数各自的出现...

weixin_44273380的博客 1437

Android 13.0 双屏时触摸失效问题排查与修复

摘要:本文记录了RK3588 Android12开发板上主屏触摸失效问题的排查与解决过程。通过分析发现,USB触摸设备被错误关联到辅屏(displayId=3)而非主屏(displayId=0)。解决方案是修改TouchInputMapper.cpp,强制触摸设备使用INTERNAL viewport(主屏),并保持设备在viewport不活跃时仍启用。该修改涉及约40行代码,有效解决了多显示器环境下触摸设备错误映射的问题,同时提供了详细的调试方法和注意事项。

ip0417的博客 354

数据结构 - 主席树

文章目录好文推荐例题【模板】可持久化线段树 1(主席树)题目代码 好文推荐 权值线段树、主席树学习 树状结构之主席树 例题 【模板】可持久化线段树 1(主席树) 题目 题目传送门:【模板】可持久化线段树 1(主席树) 代码 #include&lt;bits/stdc++.h&gt; using namespace std; const int maxn=2e5+5; int n,m,len...

竹摇清影照幽窗 1936

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【模板】【数据结构】【树】主席树

技巧一:离散去重 for(int i=1;i<=n;i++) scanf("%d",&a[i] ),b[i]=a[i]; sort(b+1,b+n+1); int nn=unique(b+1,b+n+1)-b-1;//假设有x个数,那么nn指针会停在第x+1个数的位置 ,nn及以后的都是重复的元素for(int i=1;i<=n;i++) ...

dimei7686的博客 139

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

主席树——数据结构的克星

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5; struct node{ int e; int l,r; int lazy; node(){ e=lazy=l=r=0; } }tree[maxn*40]; int tot=0,a[maxn]; vo...

weixin_43310882 333

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【数据结构】 静态主席树

主席树也称函数式线段树或可持久化线段树。就是基于线段树的基础上,保存线段树的每个历史版本;线段树只能查询最终区间的结果,而不能查询过程中的信息,比如我们对区间进行了100次修改,问你第50次修改完时的区间和是多少?所以我们就有了主席树来实现保存线段树的每个历史版本,但注意主席树并不只是用于查询区间第k大,这只是查询历史线段树的一个用处而已!那么什么是静态主席树,就是我们这里只涉及对历史版本的查询,而不涉及对历史版本的修改(动态主席树)。

这里是阿安的博客 405

特殊的数据结构:主席树

最近学习了下主席树,发现比想象中简单,又发现网上的讲解比较复杂,于是自己写一篇简易的指南,较难的问题慢慢补吧。 什么是主席树呢 让我们来看一个经典的问题吧: 给定一个[1,n]的区间,m次操作,操作种类如下: 1 L R:查询[L,R]的区间和 2 L R X:将[L,R]的值加上X 这种经典问题,想必大家学过线段树后都可以轻松解决。然而如果再增加一种操作: 3 K:回退到第K次修改操...

橘嘉禾 92

( 数据结构专题 )【 主席树 】

( 数据结构专题 )【 主席树 】 推荐阅读:https://blog.youkuaiyun.com/bestFy/article/details/78650360 推荐阅读:https://blog.youkuaiyun.com/qq_39565901/article/details/81782739 推荐阅读:https://blog.youkuaiyun.com/chenxiaoran666/article/detai...

石旭先森的博客 237

数据结构入门2—主席树

听说划分树能解决的问题主席树基本都能解决,感觉主席树好理解又好写(至少比那些乱七八糟的平衡树亲切多了),干脆就不学划分树了qaq %%%lljakfather所有题都是主席树模板题 其实就是可持久化线段树啦。 假如一个序列有n个数,有m次修改。 首先我们想一想最暴力的方法就是建m颗线段树,虽然想想就心累,空间很难开的下。 然后发现有些节点其实是可以多次利用的,于是把儿子指针迁过去就行啦(

Serene 384

NOI数据结构:主席树

主席树详解 主席树详解_西红柿爱炒番茄-优快云博客 最详细的主席树(不修改,待修改) BZOJ 1901 最详细的主席树(不修改,待修改) BZOJ 1901_Bartholomew_的博客-优快云博客 主席树讲解 主席树讲解_zx93的博客-优快云博客 主席树详解——从入门到放弃 主席树详解——从入门到放弃_a_forever_dream的博客-优快云博客 2104:K-th Number:以题为例,一文搞懂主席树的原理+代码(我画了一天图,就是为了你能看懂!)

青少年趣味编程 292

数据结构之主席树

这里讲静态的主席树,关于静态区间第k小。(有兴趣的朋友还可以去看看我写的整体二分,代码实现略优于主席树我觉得,当然静态主席树是很好写的) 题目描述: 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值。 输入输出格式 输入格式: 第一行包含两个正整数N、M,分别表示序列的长度和查询的个数。 第二行包含N个正整数,表示这个序列各项的数字。 接下来...

weixin_30652491的博客 123

可持久化数据结构之静态主席树

如果完全掌握了主席树的前置知识,主席树其实也是一种并不算很难的数据结构(虽然蒟蒻还是花了好久)。主席树主要的前置知识就是权值线段树,一旦理解了权值线段树的相关知识,那么主席树的学习应该也会变得较为简单。 权值线段树 权值线段树是线段树的一种,但是它与普通线段树不同的地方在于,普通线段树节点的区间代表的是序列中的区间,而权值线段树节点的区间则代表了序列中值的区间。 如这样一个序列:1 4 2 3 3 普通线段树中我们通常以序列下标为范围来进行线段树的区间划分,而在权值线段树中这个数组是这样保存的: 其中每个节

rwbyblake的博客 170

【数据结构】主席树与一般线段树的比较

背景 明天是JSOI2019省选R1D1。今天考虑到近期数据结构手生了,决定把几种线段树理一下。 在这个过程中,有两点发现。其一是在某些实现下,可持久化的数据结构往往只需要普通的数据结构加入几行代码即可。这就意味着,可持久化的本质就应当是由基础数据结构适当记录更改而实现的。 当然,像这样的普通数据结构,它越接近于算法的本质(比如树形用指针,而不是用数组,甚至是用一些粗...

czyarl的博客 429

HDU 5919 Sequence II [主席树]【数据结构】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5919 —————————————————————————————————————— Sequence IITime Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm

Tabris的博客 597

数据结构:主席树

BZOJ3524 这道题是BZOJ的权限题,我去vijos的newbzoj上面交了一次,但是可能是他们的数据出毛病了 这道题应该算是裸的主席树的板子,一般情况下,主席树是不允许修改的,如果主席树可以支持修改那么就变成了树套树之树状数组套主席树的问题了 为了熟悉树套树我先来熟悉了一下这个问题 只有查询,没有修改 int n,m,sz; int root[500005],lch[100...

weixin_30266829的博客 87
上一篇: 数据结构----划分树
下一篇: 数据结构----伸展树
BIGKAKA
博客等级 码龄11年 32粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值