主席树入门

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

好久不写博客了有那么一丝小尴尬2333今天队友在旁边做题我没好意思混,又去看了看以前跟来神一起看过教学视频的主席树,感觉有点意思于是就学会了2333不过我原来的线段树风格交的时候MLE了QWQ我还特地把风格改成我那样的,感觉很爆炸。

那么主席树是什么呢,他的本质是棵线段树,好了不BB了反正网上那么多写的比我好的定义为啥要看我的呢2333。反正这玩意支持历史版本查询。我就做了一题查询区间第K大,poj2104。

这个数据结构一开始没懂怎么做,就是因为还在按线段树的模式套。线段树的递归是下标乘2进左子树,乘2+1进右子树,那个时候想不明白啊,我链出去了,那这个关系就没有了我怎么找呢。还好我最近学了splay,我再看视屏的时候感觉他的建树应该是跟splay一样建一棵父亲指向儿子的树。每次更新会产生一个新的根节点,由这个根节点一部分连在未改变的部分,一部分是自己更新的部分,就直接搞上去了很刺激。然后查询哪个版本,就从哪个版本的根进去,去查询就可以了。

K-th Number
Time Limit: 20000MS Memory Limit: 65536K
Total Submissions: 58217 Accepted: 20162
Case Time Limit: 2000MS
Description

You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able to return quickly k-th order statistics in the array segment.
That is, given an array a[1…n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: “What would be the k-th number in a[i…j] segment, if this segment was sorted?”
For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2…5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.
Input

The first line of the input file contains n — the size of the array, and m — the number of questions to answer (1 <= n <= 100 000, 1 <= m <= 5 000).
The second line contains n different integer numbers not exceeding 109 by their absolute values — the array for which the answers should be given.
The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).
Output

For each question output the answer to it — the k-th number in sorted a[i…j] segment.
Sample Input

7 3
1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3
Sample Output

5
6
3
Hint

This problem has huge input,so please use c-style input(scanf,printf),or you may got time limit exceed.

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;

//thanks to pyf ...
//thanks to qhl ...

const int N = 1e5 + 7;

struct Tree
{
    int lt, rt, sum;
} t[N * 40];
int root[N];
int cnt = 0;
void cp(Tree &x, Tree y)
{
    x.lt = y.lt, x.rt = y.rt, x.sum = y.sum;
}
void update(int l, int r, int &x, int y, int k)
{
    cnt ++;
    cp(t[cnt], t[y]);
    t[cnt].sum ++;
    x = cnt;
    if (l == r)
        return;
    int mid = (l + r) / 2;
    if (k <= mid)
        update(l, mid, t[x].lt, t[y].lt, k);
    else
        update(mid + 1, r, t[x].rt, t[y].rt, k);

}
int query(int l, int r, int lt, int rt, int k)
{
    if (l == r)
        return l;
    int sum = t[t[rt].lt].sum - t[t[lt].lt].sum;
    int mid = (l + r) / 2;
    if (sum >= k)
        return query(l, mid, t[lt].lt, t[rt].lt, k);
    else
        return query(mid + 1, r, t[lt].rt, t[rt].rt, k - sum);
}
int a[N], v[N];
int get_id(int x, int num)
{
    return lower_bound(v + 1, v + 1 + num, x) - v;
}
int main()
{
    int n, q;
    while (scanf("%d%d", &n, &q) == 2)
    {
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", a + i);
            v[i] = a[i];
        }
        sort(v + 1, v + 1 + n);
        int num = unique(v + 1, v + n + 1) - v;
        for (int i = 1; i <= n; i++)
            update(1, n, root[i], root[i - 1], get_id(a[i], num));
        for (int i = 0; i < q; i++)
        {
            int x, y, z;
            scanf("%d%d%d", &x, &y, &z);
            printf("%d\n", v[query(1, n, root[x - 1], root[y], z)]);
        }
    }
}
【算法学习】主席树入门 主席树入门 原理 主席树入门 主席树,也叫做可持久化线段树,准确来说,应该叫做可持久化权值线段树,因为其中的每一颗树都是一颗权值线段树。 所谓权值线段树,就是指线段树的叶子节点保存的是当前值的个数。这样说起来比较抽象,下面用具体例子来简单阐述。 如有数列:2 1 2 5 1 1 1 3,不难统计出,数列中数字1出现了4次,数字2出现了2次,数字3、数字5都出现了1次,对于这... 阅读详情

相关推荐

告别机载网络通信混乱:利用ARINC825的LCC与带宽管理机制构建高可靠CAN总线

本文深入探讨了ARINC825规范如何通过逻辑通信通道(LCC)和带宽管理机制解决机载CAN总线通信的混乱问题。文章详细解析了ARINC825的核心架构设计、LCC工程实现、时间触发带宽管理等关键技术,展示了其在提升航空电子系统可靠性和实时性方面的显著效果,为现代飞机通信系统提供了高可靠解决方案。

weixin_26878995的博客 241

主席树详解(基础)

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

nxhx_的博客 4661

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(上)

本文深入解析了AM32电调固件的源码架构与核心模块实现。文章首先介绍了AM32电调作为开源无人机;动力心脏的重要地位,随后从硬件基础、源码目录、模块划分三个维度构建解析框架。重点剖析了系统初始化模块的时钟配置、GPIO初始化和定时器设置,以及FOC控制模块的坐标变换算法、角度估算和SVPWM生成等关键技术实现。通过逐行代码解析,揭示了电调如何将飞控指令转换为电机驱动的完整过程,为开发者理解AM32电调工作原理提供了系统性指导。

bother3000的博客 6562

详解——主席树

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

weixin_30657541的博客 388

VMware vSphere运维管理手册

ESXi 7.0 引入了一种系统存储布局,可对大型模块和第三方组件进行灵活的分区管理和支持,同时简化了调试操作。ESXi 7.0 系统存储更改在 ESXi 7.0 之前,分区大小固定不变,除 /scratch 分区和可选 VMFS 数据存储之外,且分区号是静态的,这些限制了分区管理。在 ESXi 7.0 中,分区整合为更少且更大的可扩展分区,具体取决于所使用的引导介质及其容量。ESXi 7.0 系统存储布局包含四个分区:分区适用情况类型系统引导存储引导加载程序和 EFI 模块。FAT16。

Avenjan优快云博客 3624

竞赛无人机模块化开发实战:2023 TI电赛G题空地协同消防系统(飞控与视觉融合篇)

本文以2023年TI电赛G题为例,详细阐述了采用模块化开发思维构建空地协同智能消防系统的实战方法。文章重点拆解了无人机飞控二次开发、视觉识别与融合控制等核心模块,提供了硬件选型、代码实现与系统联调的完整指南,旨在帮助参赛者通过“搭积木”式编程高效完成复杂系统集成。

js777的博客 454

主席树入门详解

简介 主席树全称应为可持久化权值线段树,可用于解决区间第k小问题。但可能由于这个的影响力比较大,现在主席树也被泛指为可持久化线段树。 主席树树是由NOI选手黄嘉泰(HJT,咱也不敢说)首先使用的。黄嘉泰原话:“这种求k 大的方法(函数式线段树)应该是我最早开始用的”。 可持久化线段树 可持久化数据结构 (Persistent data structure) 是可以保留每一个历史版本,并且支持操作的不可变特性 (immutable)。 可持久化线段树即保留多个历史版本(第k个版本即第k次修改后,第k+1次版本

SCUEC__zhazhahui的博客 1346

STK相关总结

STK简介 一.SIM卡应用工具包(SIM Application Toolkit),又名CAT/USAT,它包含一系列终端与SIM卡的交互指令,SIM卡可以应用卡内的小应用程序和终端交互,从而实现增值服务的目的,STK包括三种类,STK-imsi切换,STK –OTA,STK-BIP 功能: (1) Profile download:配置下载,开机初始化SIM卡过程中,终端告诉SIM卡终端支持哪些功能,STK中download指终端将数据发送给SIM卡 (2) Proactive command: 主动式

jingjing_2的博客 3356

主席树详解

主席树 抛出问题 给定NN个数(intint范围内),一共MM次询问,每次都要询问区间[l,r][l,r]的第kk大的数。  其中N,M,l,rN,M,l,r均不超过2×1052×105,保证询问有答案。 解决问题 暴力法 显而易见,最暴力的办法就是区间排序然后输出排序后第kk个数。最坏情况的时间复杂度是O(nmlgn)O(nmlgn),不超时才怪。 主席树(可持久化线段树)法 于是...

西红柿爱炒番茄 453

AutoSAR实验视频讲解:相关资料下载

AutoSAR实验视频讲解:闪烁一颗LED实验【相关资料下载】 总目录 为了方便大家自己的实验顺利进行,这里我们准备了一些实验中可能用到的资料供大家使用 介绍 这里主要是三个文件: MyApp_Core.0是我们的用户代码,在工程集成那集将会讲解 McalConfig.arxml就是我们的Mcal导出文件,用于导入到DaVinci中生成代码 CAN.dbc文件是我们的通信矩阵文件 以上几个文件都是简单的配置,不具有实际项目的实用性,大家仅供参考 // 顺便吐槽一句:百度网盘的吃相真的难看 下载连接

雪云飞星的博客 6668

python代码实现了一个基于图注意力网络(GAT)和长短期记忆网络(LSTM)的股票成交量预测模型

自定义数据集类:定义了类,继承自。该类用于生成股票数据的时间序列样本,每个样本包含一个长度为seq_length的时间序列和对应的目标成交量。数据加载器:使用DataLoader对数据集进行批量加载,设置批量大小为 64,并开启数据打乱功能。GAT - LSTM 模型:定义了GAT_LSTM类,继承自。该模型结合了 GAT 和 LSTM 两种神经网络:GAT 部分:使用GATConv处理全局图特征,捕获股票之间的相互关系。LSTM 部分:使用nn.LSTM处理时间序列数据,捕捉时间序列的动态变化。

huanghm88的专栏 424

主席树入门浅谈

前言 前因:朋友推给我一个主席树算法变种题,由于板子有改动就不会了,所以得出结论,算法没吃透精髓,然后白学。因此写了一篇博客 写博客的原因有: 1:以前自己假装懂了算法,会用板子,但是发现这样的习惯不好,必须得养成手撸算法的习惯,算法模型才是真正的吃透。(个人经验所得吧) 2:写这篇博客当然主要方便自己以后复习,有一些遗忘的时候,可以回头来瞧瞧。 如果不能理解得话,请多见谅 ——————————————————————————————————————— 主席树 主席树 全称 可持久化线段树 作用:可持久化维

weixin_44224825的博客 256

UI自动化控制PC端微信获取当前群聊的群友列表

在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家。 基础教程详见: https://blog.youkuaiyun.com/as604049322/article/details/121391639 人工打开要抓取的群聊窗口后,首先获取微信窗口并点击聊天信息按钮: import uiautomation as auto auto.uiautomation.SetGlobalSearchTimeout(1) wechatWind

小小明-代码实体的专栏 3万+

主席树简单入门

主席树在每次更新的叶子节点时,记录从根节点开始一路到叶子节点的更改节点信息。每个节点值更新后,还可以通过该节点更新前的根节点查询之前的信息。 如下图所示: 入门题目:给定n个数,q个询问,每次回答某个区间内不相同的元素个数。n, q(1 <= n, q <= 100000),n个正整数a_1, a_2, a_3, …, a_n(对于任意的1 <= i <= n,都有...

Coding A World 312

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

主席树详解——从入门到放弃

要想学主席树,首先要搞懂可持久化线段树,因为主席树运用到了它的思想。 主席树的模板题是:静态查询区间第k小 那么主席树的做法就是,先把全部数字离散化,然后以每一个前缀建一棵权值线段树,显然,如果直接建,那么空间上是不允许的,但是我们发现,每两个相邻的前缀中,只有一个数的差别,所以,他们公共部分是很多的,于是,我们就可以用到可持久化线段树了! 首先,要明确一下,主席树上每个节点的值的定义(我们...

a_forever_dream的博客 5562

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

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

主席树入门模板

模板题 #include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; int num[maxn],num2[maxn]; int root[maxn]; struct node{ int l,r,val; }Node[maxn<<5]; int tot,node_cnt; void m...

SCUEC__zhazhahui的博客 195

NTscan扫描工具

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

主席树入门+博客推荐

主席树入门+博客推荐 学习总结(可以直接翻到最下面,笔芯推荐的资料学习) 主席树是就是多颗线段树的总结 主席树的结构体中的 \(l\) 和 \(r\) 代表的是这个节点的左右子节点的标号,因为空间优化的原因,他们可能不再符合左子树编号等于\(rt<<1\),右子树编号等于\(rt<<1|1\),这也是我开始比较困惑的一点。在学习主席树之前,需要你很熟悉线段树这个...

weixin_30715523的博客 188

主席树入门学习

总是听到主席树这个高大上的名字,仰慕已久,今天开始简单地学习 主席树是一种可持续化数据结构,这个名字与算法本身并无太大关联,听说是以创造者命名的。 主席树,简单来讲,其实就是线段树。一堆的线段树,而且每一个只由前一个修改而来。 什么意思?我们来看个例子 你有一个区间{1,3,8,7,6,7,2}   【我滚出来的】 然后你以这个区间建了一个线段树,每个节点维护区间

Mychael的无声乐章 438

主席树入门题

主席树 全称是可持久化权值线段树(以前一直分不清可持久化线段树和主席树的区别) 但实际上写法跟可持久化trie没什么区别,维护权值就OK了 那就不讲了 jzoj1011 题目 Description JZ拥有一个很大的野生动物园。这个动物园坐落在一个狭长的山谷内,这个区域从南到北被划分成N个区域,每个区域都饲养着一头狮子。这些狮子从北到南编号为1,2,3,…,N。每头狮子都有...

某司机的黑车 534
上一篇: 哈尔滨理工大学软件学院大一个人赛训练Round2 部分题解
下一篇: 树的重心
OneDay_pyf
博客等级 码龄10年 6粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值