1. 程式人生 > >RMQ 求區間最值

RMQ 求區間最值

pku 3264

#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
const int N=5e4+7;
int a[N];
int
n; int mx[N][20],mi[N][20]; void rmq()//預處理O(nlogn) { for(int i=1; i<=n; i++) mx[i][0]=a[i],mi[i][0]=a[i];//初始狀態 for(int j=1; (1<<j)<=n; j++)//兩層for不能反,自己思考一下 for(int i=1; i+(1<<j)-1<=n; i++) { mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1
]); mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); } } int query(int l,int r)//查詢 O(1) { int k=trunc(log2(r-l+1));//即取整,去尾 // trunc(number,num_digits) // Number 需要截尾取整的數字。 // Num_digits 用於指定取整精度的數字。Num_digits 的預設值為 0。 return (max(mx[l][k],mx[r-(1<<k)+1][k])-min(mi[l][k],mi[r-(1
<<k)+1][k]));//預處理已經完全 可直接返回 } int main() { int q; while(~scanf("%d%d",&n,&q)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); rmq(); for(int i=0;i<q;i++) { int l,r; scanf("%d%d",&l,&r); printf("%d\n",query(l,r)); } } }

RMQ演算法不能修改
dp[i][j] 代表從 i 到 i+2^j-1 的最大/小值

預處理:dp[i][0]為最初始

查詢 l 到 r 的最值:k是小於(r-l+1)最小的2的冪次那麼l到l+(1<

相關推薦

RMQ 區間

pku 3264 #include <cstdio> #include <cstring> #include <string> #include <al

RMQ區間問題

#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm&g

RMQ區間 nlog(n)

RMQ演算法全稱為(Range Minimum/Maximum Query)意思是給你一個長度為n的陣列A,求出給定區間的最值的下標。當然我們可以採用列舉,但是我們也可以使用線段樹來優化,複雜度為

hdu1754-I Hate It 線段樹RMQ演算法區間問題

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total

筆記:RMQ區間)之ST算法

運算 不變 想要 parse 計算機語言 c++ 是我 動態規劃 容易 RMQ(區間最值)之ST算法 RMQ即Range Minimum/Maximun Query 中文意思:查詢一個區間的最小值/最大值 比如有這樣一個數組:A{3 2 4 5 6 8 1 2 9 7},

HDU6447 YJJ's Salesman-2018CCPC網絡賽-線段樹區間+離散化+dp

fine 滾動 tps 記得 size names sum 離散 圖片 目錄 Catalog Solution: (有任何問題歡迎留言或私聊 && 歡迎交流討論哦 Catalog Problem:Portal傳送門 ?原題目描述在最下面。 ?1e5個點

樹狀陣列區間和單點更新

題目連結:https://cn.vjudge.net/contest/66989#problem/B AC程式碼: #include<iostream> #include<string> #include<cstring> #include<cm

樹狀陣列區間

1627: 極差 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 還記得高中數學的統計部分的極差嗎?既然你能上zcmu計算機及其相關專業,想必計算能力是很厲害的,有一個實

2018CCPC網路賽-線段樹區間+離散化+dp

 原題目描述在最下面。  1e5個點,問從(0,0)走到(1e9,1e9)的最大收益。  當你從(u-1,v-1)走到(u,v)時,你可以獲得點(u,v)的權值。 solution:  十分詳細了。  直接線段樹區間最值。當然也可以樹狀陣列,不能st表。  dp

2823 Sliding Window 區間 線段樹好慢,能用單調佇列

Sliding WindowTime Limit: 12000MSMemory Limit: 65536KTotal Submissions: 14533Accepted: 4096Case Time Limit: 5000MSDescriptionAn array of s

ST表-RMQ(區間)問題。

Code: #include<bits/stdc++.h> using namespace std; const int MAX = 2000; int n, m, x, y; int a[MAX + 5], lg[MAX + 5], maxn[MAX + 5][MAX + 5];

RMQ演算法 快速區間

RMQ基本上就是來求區間嘴子問題的 maxsum【i】【j】表示從數字num【】下表i開始的後1<<j個數的最大值minsum為最小值  開始初始化兩個陣列         for(i=1;i<=n;i++)         {             m

[01字典樹]序列完美度(區間大異或)

函數表 字典 style targe efi cnblogs main code blank https://nanti.jisuanke.com/t/15531 解題關鍵:01字典樹模板,用字典樹保存每個數的二進制表示,從而動態維護區間上的最大異或值,註意添加和刪除都可

POJ 3368 Frequent values(RMQ 區間出現多次數的數字的次數)

popu man most add scrip algo main for you 題目鏈接:http://poj.org/problem?id=3368 Description You are given a sequence of n int

nyoj 119士兵殺敵(三)(線段樹區間查詢,RMQ算法)

信息 include out online log 每次 left 一行 [0 題目119 題目信息 執行結果 本題排行 討論區 士兵殺敵(三) 時間限制:2000 ms | 內存限制:65535 KB 難度:5

RMQ算法區間

nbsp 覆蓋 main 明顯 else while int 最大值 turn 問題類型:是多次詢問一個大區間裏子區間的最值問題 dp + 位運算的思想處理 rmax[i][j]表示從i開始到i + 2^j - 1的區間裏的最大值dp[i][j] ==== (i,i + 2

POJ 3264 線段樹區間

很裸的線段樹,沒有什麼好說的,我把根節點所擁有的左右區間都寫在結構體裡面,這樣傳參的時候比較方便。 POJ不支援萬能頭很不習慣。 #include<iostream> #include<cstdio> using namespace std; const int

hdu1754 區間更新查詢(單點更新+查詢區間

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 106776  &n

區間問題(RMQ

題目描述 給出N個數,求第a個數到第b個數之間最大的數減去最小的數的結果 程式輸入說明 N(N小於100,000),M(M小於100,000)

快速查詢區間——RMQ演算法(ST實現)

概述 RMQ(Range Minimum/Maximum Query),即區間最值查詢,是指這樣一個問題:對於長度為n的數列A,回答若干詢問RMQ(A,i,j)(i,j<=n),返回數列A中下標在i,j之間的最小/大值。這兩個問題是在實際應用中經常遇到