【海賊王的數據航海】ST表——RMQ問題

目錄

1 -> RMQ問題

1.1 -> 定義

1.2 -> 解決策略

2 -> ST表

2.1 -> 定義

2.2 什么是可重復貢獻問題

2.3 -> 預處理ST表

2.4 -> 處理查詢

2.5 -> 實際問題


1 -> RMQ問題

1.1 -> 定義

RMQ (Range Minimum/Maximum Query)即區間最值查詢問題指:有一組數據和若干個查詢,要求在短時間內回答每個查詢[ l ,r ]?內的最值。

1.2 -> 解決策略

  1. 樸素搜索:暴力(BFS/DFS) 時間復雜度O(n)。
  2. 線段樹(Segment Tree) 時間復雜度O(n)-O(logn)。
  3. ST表(Sparse Table,稀疏表):倍增思想,O(nlogn)預處理,O(1)查詢最值。

2 -> ST表

2.1 -> 定義

ST表(Sparse Table,稀疏表),主要應用倍增思想,是一種用于解決可重復貢獻問題數據結構。它通過預處理給定數組,創建一個二維表格,使得任何區間的最小/最大值查詢都可以在常數時間內完成。ST表特別適合于靜態數據:當數列不經常改變時,它是最有效的。可以實現O(nlogn)預處理、O(1)查詢。主要用于解決RMQ問題

2.2 什么是可重復貢獻問題

可重復貢獻問題是指在某些特定的數學運算中,當運算的性質滿足一定條件時,即使是在包含重復部分的區間內進行詢問,所得到的結果仍然是相同的問題。這種問題的特點是,它們可以通過預處理所有可能的區間,然后在查詢時直接返回預處理的結果來解決。例如,最大值問題和最大公因數問題就是典型的可重復貢獻問題,因為它們滿足以下性質:

  • 最大值滿足?max(x, x) = x
  • 最大公因數滿足?gcd(x, x) = x

這些性質意味著,對于任何給定的數?x,其自身與其他任何數的最大值或最大公因數仍然是?x?本身。因此,當我們需要計算一個區間內的最大值或最大公因數時,可以將區間分割成更小的子區間,并利用這些子區間的結果來快速得出整個區間的答案。?

2.3 -> 預處理ST表

倍增法遞推:用兩個等長的小區間拼湊成一個大區間。

f[ i ][ j ] 以第 i 個數為起點,長度為2^{^{j}}的區間中的最大值。

理想狀態方程:f[ i ][ j ] = max(f[ i ][ j - 1 ], f[ i + 2^{j - 1}][j - 1])

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
using namespace std;const int N = 1e5 + 10;const int M = 20;int f[N][M];int main()
{//預處理ST表int n = 0;int m = 0;for (int i = 0; i < n; i++)cin >> f[i][0];for (int j = 1; j <= M; j++)  //枚舉區間長度for (int i = 1; i + (1 << j) - 1 <= n; i++)  //枚舉起點f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);return 0;
}

區間終點:i+ 2^{j}-1\leq n

假如n = 6

區間長度倍增:1,2,4,8……

f[ i,0 ]:[ 1 1 ][ 2 2 ][ 3 3 ][ 4 4 ][ 5 5 ][ 6 6 ]

f[ i,1?]:[ 1 2?][ 2 3?][ 3 4?][ 4 5?][ 5 6?]

f[ i,2?]:[ 1 4?][ 2 5?][ 3 6?]

j=3:i+2^{j}-1=1+8-1>6

2.4 -> 處理查詢

對查詢區間[ l,r ]做分割、拼湊。

區間長度的指數:k=log_{2}(r - l + 1)

k = 0:{1}

k = 1:{2,3}

k = 2:{4,5,6,7}

k = 3:{8,9,10,11,12,13,14,15}

通過觀察可以發現:2^{k}\leq r-l+1< 2\cdot 2^{k}

即區間[ l,r ]必可以用兩個長度為2^{k}的區間重疊拼湊

max(f[l][k],f[r-2^{k}+1][k])?

    int l = 0;int r = 0;for (int i = 1; i <= m; i++){scanf("%d %d", &l, &r);int k = log2(r - l + 1);  //區間長度指數printf("%d\n", max(f[l][k], f[r - (1 << k) + 1][k]));}

[1,4] -> [1,4] + [1,4]?

[1,5] -> [1,4] + [2,5]?

[1,6] -> [1,4] + [3,6]?

[1,7] -> [1,4] + [4,7]?

總結:凡是符合結合律且可重復貢獻的信息查詢都可以使用ST表。顯然最大值、最小值、最大公因數、最小公倍數、按位或、按位與都符合這個條件。如果涉及區間修改操作,就要使用線段樹解決了。?

2.5 -> 實際問題

luogu:P3865

題目鏈接:P3865 【模板】ST 表

題目背景

這是一道 ST 表經典題——靜態區間最大值

題目描述

給定一個長度為?N?的數列,和?M?次詢問,求出每一次詢問的區間內數字的最大值。

輸入格式

第一行包含兩個整數?N,M,分別表示數列的長度和詢問的個數。

第二行包含?N?個整數(記為 ai?),依次表示數列的第?i?項。

接下來?M?行,每行包含兩個整數?𝑙𝑖,𝑟𝑖,表示查詢的區間為?[𝑙𝑖,𝑟𝑖]。

輸出格式

輸出包含?M?行,每行一個整數,依次表示每一次詢問的結果。

輸入輸出樣例

輸入 #1

8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8

輸出 #1

9
9
7
7
9
8
7
9

說明/提示

對于?30%30%?的數據,滿足?1≤𝑁,𝑀≤101≤N,M≤10。

對于?70%70%?的數據,滿足?1≤𝑁,𝑀≤1051≤N,M≤105。

對于?100%100%?的數據,滿足?1≤𝑁≤1051≤N≤105,1≤𝑀≤2×1061≤M≤2×106,𝑎𝑖∈[0,109]ai?∈[0,109],1≤𝑙𝑖≤𝑟𝑖≤𝑁1≤li?≤ri?≤N。

AC代碼:

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
#include <cmath>
using namespace std;const int N = 1e5 + 10;const int M = 20;int f[N][M];int main()
{//預處理ST表int n = 0;int m = 0;scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++)scanf("%d", &f[i][0]);for (int j = 1; j <= M; j++)  //枚舉區間長度for (int i = 1; i + (1 << j) - 1 <= n; i++)  //枚舉起點f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);int l = 0;int r = 0;for (int i = 1; i <= m; i++){scanf("%d %d", &l, &r);int k = log2(r - l + 1);  //區間長度指數printf("%d\n", max(f[l][k], f[r - (1 << k) + 1][k]));}return 0;
}

感謝各位大佬支持!!!

互三啦!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41875.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go 語言多版本管理的最佳實踐 —— Linux 和 Windows 專題20240702

Go 語言多版本管理的最佳實踐 —— Linux 和 Windows 專題 引言 在軟件開發的世界里&#xff0c;保持開發環境的最新和兼容至關重要。特別是 Go 語言&#xff0c;隨著版本的更新&#xff0c;不同項目可能需要不同的 Go 版本。這時&#xff0c;如何在同一臺機器上高效管理多個…

黑馬點評DAY2|Redis基本操作

Redis客戶端 命令行客戶端 進入到redis的安裝目錄&#xff0c;可以看到redis-cli文件&#xff0c;這就是redis的命令行客戶端&#xff0c;在安裝redis時自帶的。 使用方式如下 redis-cli [options] [commonds]其中常見的options有&#xff1a; -h 127.0.0.1 &#xff1a;指…

電量監測與電量計基礎知識

硬件之路學習筆記 ?-----前文導讀----- ①、公眾號主頁點擊發消息 ②、點擊下方菜單獲取系列文章 -----本文簡介----- 主要內容包括&#xff1a; ①&#xff1a;簡介 ②&#xff1a;省成本方式-電阻分壓 ③&#xff1a;精確方式-電量計與阻抗跟蹤技術 ----- 正文 ----…

Hugging face Transformers(1)—— 基礎知識

Hugging Face 是一家在 NLP 和 AI 領域具有重要影響力的科技公司&#xff0c;他們的開源工具和社區建設為NLP研究和開發提供了強大的支持。它們擁有當前最活躍、最受關注、影響力最大的 NLP 社區&#xff0c;最新最強的 NLP 模型大多在這里發布和開源。該社區也提供了豐富的教程…

JavaWeb--jquery篇

概述 jQuery是一個快速、簡潔的JavaScript框架&#xff0c;是一個優秀的JavaScript代碼庫&#xff08;框架&#xff09;于2006年1月由John Resig發布。它封裝JavaScript常用的功能代碼&#xff0c;提供一種簡便的JavaScript設計模式&#xff0c;優化HTML文檔操作、事件處理、動…

2229:Sumsets

網址如下&#xff1a; OpenJudge - 2229:Sumsets 這題不是我想出來的 在這里僅做記錄 代碼如下&#xff1a; #include<iostream> using namespace std;const int N 1000000000; int dp[1000010]; int n;int main() {cin >> n;dp[0] 1;dp[1] 1;for (int i 2…

前端面試題7(單點登錄)

如何實現單點登錄 單點登錄&#xff08;Single Sign-On&#xff0c;簡稱SSO&#xff09;是一種允許用戶在多個應用系統中只需登錄一次&#xff0c;就可以訪問所有相互信任的應用系統的認證技術。實現前端單點登錄主要依賴于后端的支持和一些特定的協議&#xff0c;如OAuth、Ope…

無法下載cuda

cuda下載不了 一、臺式機電腦瀏覽器打不開cuda下載下面二、解決辦法 一、臺式機電腦瀏覽器打不開cuda下載下面 用360、chrome、Edge瀏覽器都打不開下載頁面&#xff0c;有的人說后綴com改成cn&#xff0c;都不行。知乎上說是網絡問題&#xff0c;電信換成換成移動/聯通的網絡會…

Selenium 切換 frame/iframe

環境&#xff1a; Python 3.8 selenium3.141.0 urllib31.26.19說明&#xff1a; driver.switch_to.frame() # 將當前定位的主體切換為frame/iframe表單的內嵌頁面中 driver.switch_to.default_content() # 跳回最外層的頁面# 判斷元素是否在 frame/ifame 中 # 126 郵箱為例 # …

無人機云臺類型及作用

無人機云臺主要分為三種類型&#xff1a; 單軸云臺&#xff1a;僅支持單向旋轉&#xff0c;適合拍攝平滑的延時攝影和全景照片。 雙軸云臺&#xff1a;支持水平和垂直旋轉&#xff0c;可用于拍攝流暢的視頻和運動物體。 三軸云臺&#xff1a;全面支持所有旋轉軸&#xff0c;…

醫院陪診系統開發的關鍵技術與挑戰

隨著醫療服務需求的不斷提升&#xff0c;傳統的醫院服務模式面臨著巨大的壓力和挑戰。為了提升患者的就醫體驗和醫療服務的效率&#xff0c;醫院陪診系統應運而生。本文將探討醫院陪診系統開發的關鍵技術與挑戰&#xff0c;并結合具體的技術代碼進行分析。 一、醫院陪診系統的…

什么是可定制的鋰電池?它的應用范圍有哪些?

鋰電池在新能源汽車領域已經得到了廣泛的應用。然而&#xff0c;隨著科技的不斷進步和人們對于個性化需求的日益增長&#xff0c;可定制的鋰電池逐漸成為了市場的新寵。那么&#xff0c;究竟什么是可定制的鋰電池&#xff1f;它與普通鋰電池有何不同&#xff1f;它的應用范圍又…

android——設計模式(工廠模式)

一、工廠模式 Android 設計模式中的工廠模式是一種創建型設計模式&#xff0c;它提供了一種創建對象的最佳方式&#xff0c;而不必暴露其內部的創建邏輯。在Android中&#xff0c;工廠模式通常用于管理復雜組件實例化的過程&#xff0c;比如創建各種View、Activity、Fragment等…

Docker實戰教程(二)

文章目錄 基于Docker的微服務架構案例一、準備工作二、服務定義1. 用戶服務(User Service)2. 訂單服務(Order Service)3. 前端服務(Frontend Service)三、Docker Compose文件四、啟動微服務架構五、常見問題和解決方案六、總結基于Docker的微服務架構案例 在本案例中,我…

悠律凝聲環開放式耳機強者現身:集顏值和創新技術于一體的杰作

隨著技術的飛速發展&#xff0c;藍牙耳機已經成為人們生活中不可缺少的一環&#xff0c;外觀、音質以及實用性已經成為人們在購買時最主要的考慮因素。悠律凝聲環RingBuds Pro開放式藍牙耳機&#xff0c;憑借其特有的輕奢時尚外觀&#xff0c;斬獲2024年度MUSE繆斯創意獎金獎&a…

Android SeekBar設置指示器標簽,使用PopupWindow的方式

給Android 原生的SeekBar控件添加一個指示器標簽&#xff1b;記錄一下 按下時彈出popupwindow&#xff0c;進度條更新時刷新pw&#xff0c;松開時關閉pw&#xff1b; public class SeekBarPopUtils {private static PopupWindow popWin null;private static ConstraintLayou…

Kotlin協程使用詳解

協程是什么 協程是一種編程思想,并不局限于特定的語言。協程是輕量級的線程,基于線程池API,通俗的來說,就是官方提供的線程框架。協程的調度完全由用戶控制。協程擁有自己的寄存器上下文和棧。當我們在了解協程的時候,不可避免的會跟線程、進程作比較作分析,下面來貼個圖…

數據可視化之智慧城市的脈動與洞察

在數字化轉型的浪潮中,城市作為社會經濟發展的核心單元,正經歷著前所未有的變革。城市數據可視化大屏看板作為這一變革中的重要工具,不僅極大地提升了城市管理效率,還為公眾提供了直觀、全面的城市運行狀態視圖,成為智慧城市建設不可或缺的一部分。本文將深入探討以“城市…

ruoyi后臺修改

一、日志文件過大分包 \ruoyi-admin\src\main\resources\logback.xml <!-- 系統日志輸出 --> <appender name"file_info" class"ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-info.log</file><!…

網安小貼士(9)網絡解密

一、前言 網絡解密技術的發展是一個不斷進化的過程&#xff0c;它與加密技術的進展緊密相連。 二、定義 網絡解密&#xff08;Network Decryption&#xff09;通常指的是在計算機網絡環境中&#xff0c;將加密的數據轉換回其原始可讀格式的過程。這個過程需要使用正確的密鑰…