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之間的最小/大值。這兩個問題是在實際應用中經常遇到