主席树入门

可持久化线段树(主席树)详解(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次,对于这... 阅读详情

相关推荐

懒人精灵手游内存技术分析

教学声明:全套教程教学用到的游戏采用手游私服网游进行测试,不针对任何游戏。教学只做计算机技术研究,不做其他用途。

yizhihaoren123的博客 1656

主席树详解(基础)

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

nxhx_的博客 4661

DeepSeek与豆包无缝对接:5分钟搞定智能周报自动化(附完整代码)

本文详细介绍了如何利用DeepSeek与豆包API,快速搭建一个智能周报自动化系统。通过整合豆包平台的工作流数据,并调用DeepSeek大模型进行深度分析与内容生成,该系统能在5分钟内自动抓取、分析多源信息,并生成结构清晰、富有洞察力的团队周报,显著提升工作效率。

weixin_29029995的博客 493

详解——主席树

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

weixin_30657541的博客 388

FOC项目知识点总结三 | 完全搞懂 Clarke 与 Park 变换(附动图,仿真文件以及详细讲解数学推导过程)

本文目的,最终可以完整推算两种变换 Clarke 变换 首先先看我们需要用到的两种坐标系 1. 自然坐标系 abcabcabc 我们知道,通过三相逆变电路,我们可以画出一个自然坐标系 abcabcabc ,即三相电压的坐标系,通入的电流在这三轴坐标系中变化: 将三个矢量相加合并在一起就如下图所展现: 使用三个坐标轴来表示十分的麻烦与不直观,因为其是非正交的,于是乎我们想要将其转化成使用两个正交的坐标轴来表示,于是乎便有了 Clarke变换。 Clarke 变换的作用: 将基于三轴二维的定子静止坐标系的各

Wilson Huang的博客 3万+

Comsol固体力学仿真﹣﹣受均匀内压的厚壁球壳弹塑性分析(加载卸载全流程)

COMSOL固体力学及结构力学仿真较少,故而查询了有关资料,才建立了如下模型。图4 加载卸载全历程中的冯米塞斯应力变化。该有限元模型是通过扫掠而得的结构化网格。图2 加载卸载全历程中的塑型区域变化。图3 加载卸载全历程中的位移应力变化。图6 关键节点第一,第三主应力分布。图5 关键节点应力场与塑性区分布。《弹塑性力学》大作业,记录一下。图1 球体的有限元网格模型。

weixin_62236383的博客 1486

主席树入门详解

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

SCUEC__zhazhahui的博客 1346

WordPress MasterStudy LMS插件 SQL注入漏洞复现(CVE-2024-1512)

WordPress Plugin MasterStudy LMS 3.2.5 版本及之前版本存在安全漏洞,该漏洞源于对用户提供的参数转义不足,导致可以通过 /lms/stm-lms/order/items REST 路由的 user 参数进行基于联合的 SQL 注入。

0xSec 1437

主席树详解

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

西红柿爱炒番茄 453

时空智友企业信息管理系统任意文件读取漏洞复现

时空智友企业信息管理系统是一个用于企业流程管理和控制的软件系统。它旨在帮助企业实现流程的规范化、自动化和优化,从而提高工作效率、降低成本并提升管理水平。时空智友企业信息管理系统存在任意文件读取漏洞,攻击者可以在未授权的情况下读取系统上的文件。没有人规定,一朵花一定要成长为向日葵或者玫瑰。

The current road is different, love needs to distinguish between right and wrong 970

MIKE水动力笔记7_实测数据与模型输出结果的拟合对比

上一博文【MIKE水动力笔记6】主要讲解如何自己制作实测数据的时间序列文件dfs0,而本博文讲解如何进行实测数据与模型输出结果的拟合对比。

晏长街的博客 1万+

主席树入门浅谈

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

weixin_44224825的博客 256

机器学习的低代码与无代码平台:便捷入门之路

机器学习领域正涌现出大量低代码和无代码平台,使非技术人员也能轻松应用AI技术。低代码平台(如PyCaret、H2O AutoML)需少量编程但灵活性强,而无代码工具(如Google Cloud AutoML、Teachable Machine)则完全无需编程基础。这些平台覆盖图像识别、文本处理、业务预测等多种场景,适合快速部署简单项目。但专业人士仍需注意,这些工具无法替代复杂场景下的定制化开发。随着技术进步,低门槛AI工具正在改变各行业的创新方式。

2501_90323865的博客 154

主席树简单入门

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

Coding A World 312

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

a_forever_dream的博客 5562

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

主席树入门模板

模板题 #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

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

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

主席树入门+博客推荐

主席树入门+博客推荐 学习总结(可以直接翻到最下面,笔芯推荐的资料学习) 主席树是就是多颗线段树的总结 主席树的结构体中的 \(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、付费专栏及课程。

余额充值