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演算法
- hdu3415 單調佇列求區間最大和佇列
- JavaScript 演算法:計算最大連續日期區間JavaScript演算法
- JavaScript 專題之如何求陣列的最大值和最小值JavaScript陣列
- 演算法題:O(1)時間複雜度實現獲取棧的最大值、最小值演算法時間複雜度
- java演算法 求最大公約數Java演算法
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- 求最大子陣列(貪心演算法)陣列演算法
- [藍橋杯][演算法提高VIP]上帝造題五分鐘 (線段樹+區間最小值)演算法
- Go語言實現時間滑動視窗演算法 動態計算增加量、最大值、最小值Go演算法
- Linux中awk命令正確的求最大值、最小值、平均值、總和Linux
- JavaScript 陣列最大值和最小值JavaScript陣列
- JavaScript 陣列 最大值和最小值JavaScript陣列
- JavaScript陣列最大值和最小值JavaScript陣列
- float型別最大值和最小值型別
- 求二部圖最大匹配的匈牙利演算法演算法
- 數列區間最大值(ST表)
- MSSQL多列取最大或者最小值_轉載SQL
- 最大值減不為0的最小值
- 演算法:區間樹演算法
- EK求最大流
- Python 查詢字典中最大最小值的keyPython
- JavaScript獲取陣列最大值和最小值JavaScript陣列
- JavaScript陣列中的最大值和最小值JavaScript陣列
- JavaScript陣列最大值、最小值和平均數JavaScript陣列
- int float double 各型別的最大值最小值型別
- acwing246 區間最大公約數
- C++11獲取double型別的最大最小值C++型別
- 求最大質因數
- Dinic/ISAP求最大流
- Python實用技法第7篇:字典上對資料執行計算:求最小值、最大值、排序Python排序
- 求最大公約數不同演算法的時間比較(輾轉相除法,更相減損術等)演算法
- STL區間成員函式及區間演算法總結函式演算法
- 7-1 最大值和最小值 (10分)__C++C++
- C/C++_int/float/double的最大值和最小值C++