1. 程式人生 > >【RMQ-ST演算法】hihocoder1068

【RMQ-ST演算法】hihocoder1068

  • dp[i][j]表示區間[i,i+2j)的最小值
  • dp[i][j]=min(dp[i][j1],dp[i+2j1][j1]
  • 對於詢問[le,ri],令len=rile+1,再令2lblen<2lb+1,則min[le,ri]=min{dp[le][lb],dp[ri2lb+1][lb]}
/* **********************************************

    File Name: 1068.cpp

    Auther: [email protected]

    Created Time: 2015/9/25 星期五 下午 9:19:08

*********************************************** */
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> P; const int MAX = 1000007; const int MAX_L = 21; int dp[MAX][MAX_L]; int a[MAX]; int po[MAX_L]; int main() { po[0] = 1; for (int i = 1; i < MAX_L; ++i) { po[i] = po[i - 1] << 1
; } int n; scanf(" %d", &n); for (int i = 1; i <= n; ++i) { scanf(" %d", a + i); } for (int i = n; i >= 1; --i) { dp[i][0] = a[i]; for (int j = 1; i + (1 << j) <= n + 1; ++j) { //[i, i + (1 << j)) //[i, i + (1 << (j - 1))) | [i + (1 << (j - 1)), i + (1 << j))
//=> //dp[i][j - 1] | dp[i + (1 << (j - 1))][j - 1] dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]); //printf("dp[%d][%d] = %d\n", i, j, dp[i][j]); } } int m; scanf(" %d", &m); while (m--) { int le, ri; scanf(" %d %d", &le, &ri); int lb = upper_bound(po, po + MAX_L, ri - le + 1) - po - 1; //printf("lb = %d\n", lb); //printf("cut to dp[%d][%d] and dp[%d][%d]\n", le, lb, ri - po[lb] + 1, lb); printf("%d\n", min(dp[le][lb], dp[ri - po[lb] + 1][lb])); } return 0; }

相關推薦

RMQ-ST演算法hihocoder1068

dp[i][j]表示區間[i,i+2j)的最小值 dp[i][j]=min(dp[i][j−1],dp[i+2j−1][j−1] 對於詢問[le,ri],令len=ri−le+1,再令2lb≤len&

hiho16 RMQ-ST算法RMQ-ST算法

長度 com lin line 最小 make long long turn long 傳送門:RMQ-ST算法 RMQ(Range Minimum/Maximum Query)區間範圍最值查詢問題 題意 求指定區間值最小的元素 思路 其實就是二分法的思路,統計所有長度為2

hihocoder1068 RMQ-ST演算法

思路: 這是ST表模板。遇到一道indeed筆試題需要用這個演算法,順便學習一下。那道題是說給定一個一維陣列和一些查詢[Li, Ri],要求計算[Li, Ri]區間內子段和的絕對值的最大值。解法是使用ST表計算所求區間內最大字首和 - 最小字首和即可。 實現: 1 #include <bi

探索-中級演算法遞增的三元子序列

最先想到的思路,就是用一個 Map<Integer, List<Integer>>,其中 key 對應下標 index,value 為當 index_x > index 時,如果 nums[index_x] > nums[index],則將

探索-中級演算法最長迴文子串

這一題可以參考:647. 迴文子串 本質上是一樣的,要判斷出所有的迴文字串,然後找到其中最長的那一個。 中心擴充套件法 中心擴充套件就是把給定的字串的每一個字母當做中心,向兩邊擴充套件,這樣來找最長的子迴文串。演算法複雜度為O(N^2) public Stri

探索-中級演算法無重複字元的最長子串

1. 參考自:https://juejin.im/post/5aa159f86fb9a028bb189420 思路: 初始化一個 255 的 boolean 陣列(字元對應的數字作為陣列下標)作為所有可能出現的字元對應的存在可能性,不存在重複的均為 false,存在重

探索-中級演算法字謎分組

解題的關鍵思想就是將字串建立起無關於字母順序,只關於字母個數的唯一對映關係,這樣 ,對於同一組符合要求的字串,則它們的對映都是一樣的,以此作為分組的依據。 具體的解題方法,暫時想到了兩種。 1、將字串對映為字母+數字的組合,如 a1b2c3,這樣是符合上述條件的。

探索-中級演算法矩陣置零

參考連結:https://www.jianshu.com/p/d0017b1e38c4 原地演算法:一種使用小的,固定數量的額外之空間來轉換資料的演算法。 當演算法執行時,輸入的資料通常會被要輸出的部份覆蓋掉。 O(mn) 的額外空間 public void se

探索-中級演算法三數之和

參考連結:LeetCode總結-K-Sum問題 本文介紹的解題思想的核心就是排序,排序有兩個目的,第一個是次要的,即方便排除重複的組合。第二個就是使得可以按照遞增或者遞減方便的移動指標 l、r。 在排序之後,就可以對陣列進行遍歷,目標就是找到符合 nums[l] +

探索-中級演算法兩數相加

public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if (l1==null) return l2; else if (l2==null) return l1; Li

探索-中級演算法生成括號

得到全排列的組合,同時對於不符合要求的組合要剔除。 public List<String> generateParenthesis(int n) { List<String> result = new ArrayList<>();

Connections between cities HDU - 2874線上LCA演算法

題目連結   昨天剛學了線上LCA,今天就來硬剛這道題還是花了一整天的時間,不過對於LCA卻有了更多的理解,這道題在講述不同根的做法上尤其是很好的。   題目告訴我們有N個節點和M條邊,以及C次詢問,每次查詢的是【L、R】這兩個節點間的距離,還是算得上簡單明瞭的告訴了

尋優演算法量子粒子群演算法(QPSO) 引數尋優的python實現

【尋優演算法】量子粒子群演算法(QPSO) 引數尋優的python實現 一、粒子群演算法的缺點 二、量子粒子群演算法 三、QPSO演算法的python實現 參考資料 一、粒子群演算法的缺點 本人之前的博文(參考資料【1】)已經詳細

尋優演算法粒子群演算法(PSO) 引數尋優的python實現

【尋優演算法】粒子群演算法(PSO) 引數尋優的python實現 一、演算法原理 1、粒子群演算法的名詞解釋 2、粒子更新 二、PSO演算法引數尋優的python實現 參考資料 粒子群優化演算法(Particle

尋優演算法量子遺傳演算法(QGA) 引數尋優的python實現

【尋優演算法】量子遺傳演算法(QGA) 引數尋優的python實現 一、量子編碼 1、染色體量子編碼 2、量子編碼轉換為二進位制編碼 二、量子進化 1、全乾擾交叉 2、量子變異 三、QGA多引數

尋優演算法遺傳演算法(Genetic Algorithm) 引數尋優的python實現

【尋優演算法】遺傳演算法(Genetic Algorithm) 引數尋優的python實現 一、遺傳演算法簡介 1、遺傳演算法由來 2、遺傳演算法名詞概念 3、遺傳演算法中對染色體的操作 3.1、選擇 3.2

尋優演算法交叉驗證(Cross Validation)引數尋優的python實現:多引數尋優

【尋優演算法】交叉驗證(Cross Validation)引數尋優的python實現:多引數尋優 一、網格搜尋原理 二、網格搜尋+交叉驗證用於多引數尋優的python實現 1、訓練模型及待尋優引數 2、直接迴圈巢狀實現網格搜尋 + cros

尋優演算法交叉驗證(Cross Validation)引數尋優的python實現:單一引數尋優

【尋優演算法】交叉驗證(Cross Validation)引數尋優的python實現:單一引數尋優 一、交叉驗證的意義 二、常用的交叉驗證方法 1、Hold one method 2、K-flod CV 3、Leave-One-Ou

智慧優化演算法遺傳演算法的精英選擇策略、期望選擇策略

這兩個策略,不好檢索。我從中英論文中找到了解釋,貼在這裡。 (1)最優儲存策略 這段英文不夠具體,我找到了對應中文解釋(見論文:遺傳演算法在分配問題中的應用): (2)期望選擇策略 這段英文同樣很籠統,我還是找到了中文解釋,但是換了個名稱((見論文:遺傳演算法在

JVM--17 垃圾回收演算法複製演算法

         前言:上一篇博文,我們介紹了標記-清除演算法,其中關於此演算法的兩個不足之處:效率問題和空間問題 做了特別說明。本篇介紹複製演算法就是在標記-清除演算法的基礎上進行改進。特別是標記-清除演算法可能造成記憶體空間不連續問題進行改進。          複製演