首页 > 其他分享 >跳表模型

跳表模型

时间:2023-11-19 13:23:23浏览次数:27  
标签:int res 模型 heights init 跳表 include 最值

跳表RMQ算法

求解静态区间最值的一种算法。

f[i][j] 表示 从i出发,长度为2^j这一段区间的最大值。

初始化和递推:

void init() {
    for(int j = 0; j < M; j ++ ) {
        for(int i = 1; i + (1 << j) - 1 <= n; i ++ ) {
            if(!j) f[i][j] = w[i];
            else f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
        }
    }
}

 

查询:

// 要查询[L, R]区间最值,我们取一个k,k满足2^k <= len。
// 我们要查询的值即为: max(f[l][k], f[r - (1 << k) + 1][k]) 以左端点为起点,长度为2^k的最值,和以r为终点,长度为2^k的最值,二者再取一个最值。
int query(int l, int r) {
  int k = __lg(r - l + 1);
  return max(f[l][k], f[r - (1 << k) + 1][k]); }

 

 

 简单的求区间最值

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;

const int N = 2e5 + 10, M = 18;

int n, m;
int f[N][M];
int w[N];

void init() {
    for(int j = 0; j < M; j ++ ) {
        for(int i = 1; i + (1 << j) - 1 <= n; i ++ ) {
            if(!j) f[i][0] = w[i];
            else f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
        }
    }
}

int query(int l, int r) {
    int k = __lg(r - l + 1);
    return max(f[l][k], f[r - (1 << k) + 1][k]);
}

int main() {
    cin >> n;
    for(int i = 1; i <= n; i ++ ) cin >> w[i];
    
    init();
    
    cin >> m;
    while(m -- ) {
        int l, r;
        cin >> l >> r;
        cout << query(l, r) << endl;
    }
    
    return 0;
}

 

 解答本题的关键在于查出第i个位置右边第一个大于nums[i]的数字。

可以用跳表+二分,区间最值具有二分性, [l, r]的区间最值一定小于等于[l, r + c]的区间最值。

class Solution {
public:
    const static int N = 50005, M = 17;
    int f[N][M];
    
    void init(const vector<int> &a, int n) {
        for(int j = 0; j < M; j ++ ) {
            for(int i = 1; i <= n - (1 << j) + 1; i ++ ) {
                if(!j) f[i][j] = a[i - 1];
                else {
                    f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
                }
            }
        }
    }
    
    int query(int l, int r) {
        int k = __lg(r - l + 1);
        return max(f[l][k], f[r - (1 << k) + 1][k]);
    }
    
    vector<int> leftmostBuildingQueries(vector<int>& heights, vector<vector<int>>& queries) {
        int n = heights.size(), m = queries.size();
        init(heights, n);
        vector<int> res(m);
        for(int i = 0; i < m; i ++ ) {
            int l = queries[i][0] + 1, r = queries[i][1] + 1;
            if(l > r) swap(l, r);
            if(l == r) res[i] = l - 1;
            else if(heights[l - 1] < heights[r - 1]) res[i] = r - 1;
            else {
                int L = r, R = n + 2;
                while(L + 1 < R) {
                    int m = (L + R) >> 1;
                    if(query(r + 1, m) > heights[l - 1]) R = m;
                    else L = m;
                }
                if(L == n + 1) res[i] = -1;
                else res[i] = L;
            }
        }
        
        return res;
    }
};

 

标签:int,res,模型,heights,init,跳表,include,最值
From: https://www.cnblogs.com/zk6696/p/17841905.html

相关文章

  • 最新!大模型真的存在涌现能力吗?
    摘要近期的研究表明,大型语言模型展现出了一种涌现能力,这种能力在小规模模型中不存在,但在大规模模型中显现出来。这种涌现能力吸引人的地方有两个:其一是它们的突然性,似乎是瞬间从不存在转变为存在;其二是它们的不可预测性,在看似难以预见的模型规模上出现。在这里,我们提出了一种关于......
  • 离散化模型
    离散化算法常用来解决负值问题和取值范围过大问题。 模板:使用lower_bound或者库函数set,map来写写法1.lower_bound速度快//把要进行离散化的值排序去重后放入alls数组中,用二分进行映射。intfind(intx){returnlower_bound(alls.begin(),alls.end(),x)-alls.beg......
  • 数字三角形模型
    1数字三角形#include<bits/stdc++.h>#defineCLOSEios::sync_with_stdio(false);cin.tie(0);cout.tie(0)#defineendl"\n"typedeflonglongLL;constintN=105,M=N,mod=1e9+7;usingnamespacestd;intf[N][N],a[N][N];intmain(){......
  • R语言ARMA-GARCH模型金融产品价格实证分析黄金价格时间序列|附代码数据
    全文链接:http://tecdat.cn/?p=32677原文出处:拓端数据部落公众号最近我们被客户要求撰写关于ARMA-GARCH的研究报告,包括一些图形和统计输出。研究黄金价格的动态演变过程至关重要。文中以黄金交易市场下午定盘价格为基础,帮助客户利用时间序列的相关理论,建立了黄金价格的ARMA-GA......
  • Reactor和Proactor模型
    一、Reactor模式​ Reactor翻译过来的意思是「反应堆」,这里的反应指的是「对事件反应」,也就是来了一个事件,Reactor就有相对应的反应/响应。​ 事实上,Reactor模式也叫Dispatcher模式,我觉得这个名字更贴合该模式的含义,即I/O多路复用监听事件,收到事件后,根据事件类型分配(Disp......
  • 【第4章】网络安全体系与网络安全模型(信息安全工程师)
    4.1网络安全体系概述 4.1.1网络安全体系概念一般而言,网络安全体系是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规则组成的,共同实现网络安全的目标。网络安全体系包括法律法规政策文件、安全策略、组织管理、技术措施、标准规范、安全建设与运营、人员......
  • c5w3_序列模型和注意力机制
    序列模型和注意力机制Seq2Seq模型Seq2Seq(Sequence-to-Sequence)模型能够应用与机器翻译、语音识别等各种序列到序列的转换问题。一个Seq2Seq模型包括编码器(Encoder)和解码器(Decoder)两部分,它们通常是两个不同的RNN。如下图所示,将编码器的输出作为解码器的输入,由解码器负责翻译出正......
  • c5w1_循环序列模型
    循环序列模型自然语言和音频都是前后相关联的数据,对于这些前后相关联的序列数据通过循环神经网络(RecurrentNeuralNetwork,RNN)来进行处理。使用RNN收i先的应用有下图所示的例子:上图中所有的这些问题都可以通过有监督学习,通过输入给定的标签数据\((X,Y)\)作为训练集进行学习。......
  • 信息系统项目管理师 第二十四章 项目管理成熟度模型
    1.项目管理成熟度模型概念758项目管理成熟度表达的是一个组织具有的按照预定目标和条件成功的、可靠的实施项目的能力。项目管理成熟度指的是项目管理过程的成熟度。成熟度模型总数30种成熟度5个梯级:通用术语通用过程单一方法基准比较持续改进2.OPM31.组织级项目管......
  • 常见面试题-Netty线程模型以及TCP粘包拆包
    介绍一下Netty使用的线程模型?答:Netty主要基于主从Reactor多线程模型,其中主从Reactor多线程模型将Reactor分为两部分:mainReactor:监听ServerSocket,用来处理网络IO连接建立操作,将建立的SocketChannel指定注册给subReactorsubReactor:和建立起来的socket做数据交互和......