主席树入门

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

相关推荐

Hyper-V创建Ubuntu虚拟机设置固定IP

本文记录使用hyper-v创建ubuntu虚拟机,为虚拟设置固定IP且通过物理机可访问。

2623

主席树详解(基础)

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

nxhx_的博客 4661

Windows下用Python调用科大讯飞语音唤醒SDK的避坑指南(附完整代码)

本文详细介绍了在Windows平台使用Python调用科大讯飞语音唤醒SDK的全流程,包括环境配置、核心代码实现、典型问题解决方案及进阶开发技巧。通过完整的代码示例和避坑指南,帮助开发者快速集成语音唤醒功能,提升开发效率。

u0v1w2x3的博客 405

详解——主席树

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

weixin_30657541的博客 388

在Proteus中用80C51模拟4线SPI点亮OLED屏幕

在Proteus里用80C51模拟4线SPI控制OLED屏幕使其显示图案(汇编实现)。

Connor3093的博客 5003

贝塞尔曲线基础

贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算法开发,以稳定数值的方法求出贝兹曲线。

YiYeZhiNian的博客 2045

主席树入门详解

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

SCUEC__zhazhahui的博客 1346

Python 实战:手语翻译系统——从视频到文本的智能转换

今天,我们用 Python 构建了一个。

Echo_Wish 344

主席树详解

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

西红柿爱炒番茄 453

【AI智能体】飞书 AI 智能客服机器人搭建与使用实战操作详解

飞书 AI 智能客服机器人搭建与使用实战操作详解

congge 6050

【01】Python解释器的安装

工欲善其事必先利其器。君欲学PYthon,则必先安装Python解释器。安装过程相对简单,大致跟着如下步骤走即可。

侯小啾技术博客 1258

主席树入门浅谈

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

weixin_44224825的博客 256

uniapp [全端兼容] - 实现省市区选择器三四级联动组件,uniapp选择地址自定义省市区三级联动插件,弹框式多级联动选择器区域选择(全平台兼容苹果安卓App、支付宝微信小程序、移动端H5网页)

uni-app省市区选择器,省市区街道三级四级联动选择器,uniapp自定义多列选择器省市两级联动,uniapp picker组件实现多级联动,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniApp选择器省市区县街道乡镇,uniapp实现省市区选择联动,uniapp城市三级联动(自定义组件)_uniapp三级联动,picker插件省市区联动,uniapp小程序省市区选择器,uni-app 省市区街道的四级联动选择,uniapp怎样实现省市区地址三级联动uni

🏆 前端领域优质创作者 1万+

主席树简单入门

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

Coding A World 312

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

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

a_forever_dream的博客 5562

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

主席树入门模板

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

主席树入门+博客推荐

主席树入门+博客推荐 学习总结(可以直接翻到最下面,笔芯推荐的资料学习) 主席树是就是多颗线段树的总结 主席树的结构体中的 \(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年 0粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值