主席树模板总结及题集

可持久化线段树(主席树)详解(c++ 图片演示+ 代码) 对于一颗权值线段树,我们要往里面添加n个数字,我们知道,这很容易实现,只需要一个for循环,然后调用n次update函数即可(update函数具有添加元素的功能,详见《权值线段树博文》)。,以便于我们对历史的操作,那么如果只使用权值线段树,则我们需要n个权值线段树同时保存状态,对于非常多的元素,我们就需要。我们前面提到过,每一个根可以组成一个单独的线段树,而每一个根节点都可以用一个唯一的编号表示。这种问题具有非常明显的优势,前面我们说过权值线段树也可以处理区间第k大,但是权值线段树必须是。 阅读详情

介绍篇:http://blog.youkuaiyun.com/metalseed/article/details/8045038  ->

理解篇(配图比较生动):http://blog.youkuaiyun.com/regina8023/article/details/41910615  ->

主席树三个经常用到的点:

1.查询区间第k大(在线)

2.查询区间第k大且有更新节点操作(离线,离线主要是为了将线段树上的值离散化,如果数值范围小则不需要离散化,也不需要离线,另外更新操作需要套树状数组)

3.查询区间不同数的个数(树状数组可以实现,但只能离线,主席树实现可以在线)

还有很多线段树能实现的,加了一些条件,都可以用主席树来解。

下面看题:

poj2104

区间查询第k大元素,非递归写法,非递归不好进行回溯操作,递归更好写一些

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,m;
int v[maxn],b[maxn],t[maxn],tsize,tot=0;
struct charitree
{
    int l,r,tsize;
}a[maxn*30];
int build(int l,int r)
{
    int root=tot++;
    a[root].tsize=0;
    if(l==r)
        return root;
    int m=(l+r)>>1;
    a[root].l=build(l,m);
    a[root].r=build(m+1,r);
    return root;
}
int update(int root,int x)
{
    int now=tot++;
    int tmp=now;
    a[now].tsize=a[root].tsize+1;
    int l=1,r=tsize;
    while(l<r)
    {
        int m=(l+r)>>1;
        if(x<=m)
        {
            a[now].l=tot++;
            a[now].r=a[root].r;
            now=a[now].l;
            r=m;
            root=a[root].l;
        }
        else
        {
            a[now].l=a[root].l;
            a[now].r=tot++;
            now=a[now].r;
            l=m+1;
            root=a[root].r;
        }
        a[now].tsize=a[root].tsize+1;
    }
    return tmp;
}
int ask(int lx,int rx,int k)
{
    int l=1,r=tsize;
    while(l<r)
    {
        int m=(l+r)>>1;
        if(a[a[rx].l].tsize-a[a[lx].l].tsize>=k)
        {
            r=m;
            lx=a[lx].l;
            rx=a[rx].l;
        }
        else
        {
            l=m+1;
            k-=a[a[rx].l].tsize-a[a[lx].l].tsize;
            lx=a[lx].r;
            rx=a[rx].r;
        }
    }
    return l;
}
void hash1()
{
    sort(b+1,b+1+n);
    tsize=unique(b+1,b+1+n)-b-1;//去重函数
}
int find_index(int x)
{
    return lower_bound(b+1,b+1+tsize,x)-b;
}
int main()
{
    int i,j,l,r,k;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]),b[i]=v[i];
    hash1();
    t[0]=build(1,tsize);
    for(i=1;i<=n;i++)
        t[i]=update(t[i-1],find_index(v[i]));
    while(m--)
    {
        cin>>l>>r>>k;
        printf("%d\n",b[ask(t[l-1],t[r],k)]);
    }
    return 0;
}
unique函数: 在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。

HDU - 4417

区间查询小于等于k的数的个数,和上题基本类似,修改了一下查询的函数

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,m;
int v[maxn],b[maxn],t[maxn],tsize,tot=0;
struct charitree
{
    int l,r,tsize;
}a[maxn*30];
int build(int l,int r)
{
    int root=tot++;
    a[root].tsize=0;
    if(l==r)
        return root;
    int m=(l+r)>>1;
    a[root].l=build(l,m);
    a[root].r=build(m+1,r);
    return root;
}
int update(int root,int x)
{
    int now=tot++;
    int tmp=now;
    a[now].tsize=a[root].tsi
LSM6DS3TR-C IMU传感器入门:从MEMS原理到姿态解算实战 惯性测量单元(IMU)是现代智能设备实现运动感知的核心部件,其基础原理基于微机电系统(MEMS)技术。MEMS加速度计通过检测质量块在惯性力作用下的位移来测量线性加速度,而陀螺仪则利用科里奥利力效应感知角速度。这种技术使得微型化、低成本的6自由度运动测量成为可能,为机器人、无人机、可穿戴设备等提供了关键的空间姿态和运动状态信息。在实际工程中,开发者需要掌握I2C/SPI通信协议、传感器数据读取与校准,并通过互补滤波等算法融合加速度计和陀螺仪数据,实现稳定的姿态解算。LSM6DS3TR-C作为一款高性价比的6 阅读详情

相关推荐

中科蓝讯蓝牙开发:从源码到固件的自动化构建链路解析

本文详细解析了中科蓝讯AB530X蓝牙芯片从源码到最终固件的完整自动化构建链路。通过剖析prebuild.bat、GCC编译、postbuild.bat等关键环节,阐述了资源打包、配置生成、代码编译与固件合成的全过程,并重点介绍了如何实现一键编译与自动下载,为开发者高效进行嵌入式蓝牙开发提供清晰指南。

weixin_29193259的博客 121

AIR780E二次开发点灯(LuatOS)

Air780E的LuatOS点灯教程,二次开发教程,可用于所有ec618平台,无需SDK

rootuseres的博客 1万+

声音特征提取--Demon谱分析(舰船水声)

不同频带的DEMON谱线相互之间也不一样,有的频带内会发生线谱遗失,有的频带内的线谱并不是真正的谱线。当舰船航速达到某个极限时,螺旋桨的高速旋转将产生空化噪声,由螺旋桨产生的一系列周期信号被空化噪声调制,在频域上表现为将低频的离散线谱线性搬移到较高频率噪声所处的频率周围,这些周期信号在频域是离散的线谱系列,对应舰船的轴频、叶频以及谐波频率,由于舰船辐射噪声低频部分还有其它噪声源,很难从低频段直接提取出螺旋桨产生的线谱系列,而是要先对高频段的调制信号进行解调,通过低通滤波得到信号的低频包络谱,即。

qq_52631753的博客 6506

HDMI设计6--Video PHY Controller IP

Reference:https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/vid_phy_controller/v2_2/pg230-vid-phy-controller.pdf 1. 序 Video PHY Controller IP是为实现与视频(DisplayPort和HDMI™技术)MAC传输或接收子系统的即插即用连接而设计的。视频MAC层和PHY层的接口是标准化的,能...

Archar_Saber的博客 8340

移动开发(一):使用.NET MAUI开发第一个安卓APP

它是.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。.NET MAUI 是一款开放源代码应用,是 Xamarin.Forms 的进化版,从移动场景扩展到了桌面场景,并从头重新生成了 UI 控件,以提高性能和可扩展性。

IT技术分享社区 2708

Calibre LVS 问题解析

LVS常见问题与解决办法

m0_61544122的博客 2万+

机器视觉应用工程师职位深度解析与面试指南

广东奥普特科技招聘机器视觉应用工程师,要求大专以上理工科专业背景,熟悉C/C++或PLC编程,具备自动化设备调试经验。岗位职责包括视觉项目方案评估、系统安装调试、售后技术支持及异常处理,需接受外派出差。该职位面向专业对口的应届生或实习生,强调动手能力、沟通技巧和吃苦耐劳精神。机器视觉工程师需掌握图像处理算法、硬件配置等核心技术,在工业自动化领域具有良好发展前景。求职者应注重编程能力和实践经验的积累,以胜任这一技术密集型岗位。

郑伟强dev的专栏 431

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: hdu6013Kirinriki 尺取法
下一篇: hdu6127 Hard challenge
jerans
博客等级 码龄10年 54粉丝 255原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值