poj--3264Balanced Lineup+ST演算法求區間最大最小值
題目連結:點選進入
其實這種動態查詢區間最大最小值的題目,解法是有很多的,像是線段樹和樹狀陣列都是可以做的。ST演算法效率和上面兩種是一樣的,但是編碼更為簡單。
ST演算法是一種利用了遞推思想進行計算的演算法,令dp(i,j)表示從i開始長度為2^j的一段元素中的最小值,則dp(i,j)=min(dp(i,j-1),dp(i+2^(j-1),j-1))。這是求區間最小值的遞迴關係,其實求區間最大值也是一樣的。
程式碼如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=50000+100;
int dp1[maxn][20];
int dp2[maxn][20];
int a[maxn],mm[maxn];
void RMQ_init(int n)///RMQ初始化
{
mm[0]=-1;
for(int i=1;i<=n;i++)
{
mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
dp1[i][0]=dp2[i][0]=a[i];
}
for(int j=1;j<=mm[n];j++)
for(int i=1;i+(1<<j)-1<=n;i++)
{
dp1[i][j]=min(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);
dp2[i][j]=max(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]);
}
}
int RMQ_Max(int L,int R) ///查詢最大值
{
int k=mm[R-L+1];
return max(dp2[L][k],dp2[R-(1<<k)+1][k]);
}
int RMQ_Min(int L,int R) ///查詢最小值
{
int k=mm[R-L+1];
return min(dp1[L][k],dp1[R-(1<<k)+1][k]);
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
RMQ_init(n);
while(m--)
{
int A,B;
scanf("%d%d",&A,&B);
printf("%d\n",RMQ_Max(A,B)-RMQ_Min(A,B));
}
}
return 0;
}
相關文章
- 2419 求最大值和最小值
- 靜態類求最大值最小值
- 求陣列之和,最小值,最大值,平均值陣列
- 【譯】Swift演算法俱樂部-查詢最大/最小值Swift演算法
- 演算法題:O(1)時間複雜度實現獲取棧的最大值、最小值演算法時間複雜度
- [藍橋杯][演算法提高VIP]上帝造題五分鐘 (線段樹+區間最小值)演算法
- Go語言實現時間滑動視窗演算法 動態計算增加量、最大值、最小值Go演算法
- JavaScript 陣列最大值和最小值JavaScript陣列
- Python 查詢字典中最大最小值的keyPython
- 顯示最大最小值,及其下標C++
- 最大值減不為0的最小值
- HDU 2795 Billboard(線段樹 區間最大)
- 數列區間最大值(ST表)
- acwing246 區間最大公約數
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- 求二部圖最大匹配的匈牙利演算法演算法
- JavaScript獲取陣列最大值和最小值JavaScript陣列
- JavaScript陣列中的最大值和最小值JavaScript陣列
- JavaScript陣列最大值、最小值和平均數JavaScript陣列
- EK求最大流
- Python實用技法第7篇:字典上對資料執行計算:求最小值、最大值、排序Python排序
- C++11獲取double型別的最大最小值C++型別
- STL區間成員函式及區間演算法總結函式演算法
- 求最大公約數不同演算法的時間比較(輾轉相除法,更相減損術等)演算法
- 求最大公約數 & 最大公約數
- 求最大質因數
- Dinic/ISAP求最大流
- 2397 求最大值
- C/C++_int/float/double的最大值和最小值C++
- 7-1 最大值和最小值 (10分)__C++C++
- 求區間不同數的個數【主席樹求解】
- JavaScript可以設定最大值和最小值的隨機數JavaScript隨機
- 【高數覆盤】3.5函式的極值與最大最小值函式
- 3516 求n個整數的最小值 迴圈結構
- 貪心演算法篇——區間問題演算法
- 尋找陣列中的最大值和最小值O(1.5*N)陣列
- 演算法設計與分析:求兩個自然數的最大公約數演算法
- 分治法演算法學習(一)——歸併排序、求最大子陣列和演算法排序陣列