主席树模板总结及题集

可持久化线段树(主席树)详解(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
Android Qcom USB Driver学习(十三) 该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) Android Qcom USB Driver学习(八) Android Qcom USB Driver学习(九)deals with the USB Power Delivery resources used by one or more ports on the basis of the local device policy the basis of the local device policy.opera 阅读详情

相关推荐

Unity 接入HybridCLR的点点滴滴,亲测三平台(PC、Android、WebGL)妥妥的。-问题分享

一入热更深似海啊,没有热更是真恼火啊,干啥啥不方便,动不动就得重新发包;说实在的,也是工作之余研究这个,在原有框架基础上接入这个热更,既要保持原有功能,还要支持热更,实实在在、断断续续搞了这么久,终于是接入并测通了,这一路是坎坎坷坷,下面把走过的弯弯绕绕记录下,希望对后来想接入的小伙伴有帮助吧。

GarFe的博客 1万+

Webug4.0 打靶笔记

一、Webug 的安装 (1)基本信息 WeBug 名称定义为”我们的漏洞”靶场环境 ,基础环境是基于 PHP/mysql 制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作环境。部分漏洞是基于Windows操作系统的漏洞所以将WeBug的web环境都装在了一个纯净版的Windows 2003的虚拟机中。在 webug3.0 发布后的四百多天 226安全团队终于在大年初二发布了 webug 的 4.0 版本。 (2)虚拟机的安装 最新超详细VMware虚拟机下载与安装_隐

m0_60716947的博客 6127

从东南大学906被刷到调剂过程(内含个人感想)

介绍了自己在看到初试成绩,到后期复习以及调剂的全过程,当中也包含了自己的复试中的感想,希望大家理性看待。

Philo的博客 2854

Transformer在量化交易中的应用:从时序预测到策略生成

Transformer模型凭借其强大的自注意力机制,在自然语言处理领域取得了革命性突破。其核心原理是通过并行计算和动态权重分配,有效捕捉序列数据中的长距离依赖关系。这一特性使其在金融时间序列分析中展现出巨大技术价值,能够处理市场数据中的复杂非线性模式和长期关联。在量化交易场景下,Transformer可将价格、成交量等连续数据通过离散化分桶处理,转化为类似文本的序列,进而进行预测或直接生成交易信号。本文以QuantGPT项目为例,探讨了如何将这一前沿AI架构迁移应用于金融领域,涵盖了从数据作为“语言”的编码

weixin_26757949的博客 365

Hypermesh静力学仿真分析与模态分析-02

hypermesh中对较复杂实体进行静力学分析和模态分析,包含材料属性添加,载荷设置等等

Look_forward_的博客 6776

新华DCS系统仿真测试方法详细介绍

新华DCS ICAN3.1系统是应用广泛并且功能非常强大的国产DCS系统。具有管理虚拟CPU并仿真运行的功能。并且上位机画面可以与虚拟DPU数据实时同步仿真。具体仿真方法如下所示: 1、 需要设备及软件: 2、步骤如下: 2.1硬件步骤: 1)电脑开机。 2)交换机连接电脑网卡。 3)交换机上电运行。 2.2软件步骤: 1)设置电脑IP 一般配置IP为A网工程站IP。 222.222.221.201/255.255.255.0 2)建立虚拟DPU 登录 D:\iCAN\Program\Vxcu 文件夹。

lw_waston的博客 6891

【华为OD机试】贪吃蛇(python, java, c++, js)

贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。 下面让我们来完成贪吃蛇游戏的模拟。 给定一个NM的数组arr,代表NM个方格组成的版图,贪吃蛇每次移动一个方格。 若arr[i][j] == H,表示该方格为贪吃蛇的起始位置; 若arr[i][j] == F,表示该方格为食物, 若arr[i][j] == E,表示该方格为空格。 贪吃蛇初始长度为1,初始移动方向为向左。

A_D_I_D_A_S的博客 541

vue3+element-plus - 最新详细实现将表格Table组件 “所见所得导出“ 为excel(xls/xlsx)电子表格文件,表格中的图片图像、图标等媒体资源完美导出显示(详细示例代码)

vue3,nuxt3,element plus,表格组件,Table,el-table,导出,下载,excel,电子工作簿,xls,xlsx,将表格导出成xls,如何把表格原封不动的导出成excel,保留图片,带图片,图标,如何导出包括含有图片的Excel表格,图片和表格数据导出excel,把表格导出成excel格式,表格内的图片一起导出,vue3导出图片和数据到Excel,可导出图片,导出图像到Excel,网页上的图片怎么能导出到xls表格中,显示图片url链接,图片太多导出失败,图片会超出单元格,图片不

✅ 精选推荐文章 4766

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 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、付费专栏及课程。

余额充值