1. 程式人生 > 實用技巧 >【模板】ST表(RMQ)

【模板】ST表(RMQ)

題目背景

這是一道ST表經典題——靜態區間最大值

請注意最大資料時限只有0.8s,資料強度不低,請務必保證你的每次查詢複雜度為O(1)。若使用更高時間複雜度演算法不保證能通過。

如果您認為您的程式碼時間複雜度正確但是 TLE,可以嘗試使用快速讀入:

1 inline int read(){
2     int x=0,f=1;char ch=getchar();
3     while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
4     while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
5 return x*f; 6 }

題目描述

給定一個長度為N的數列,和M次詢問,求出每一次詢問的區間內數字的最大值。

輸入格式

第一行包含兩個整數N,M,分別表示數列的長度和詢問的個數。

第二行包含N個整數(記為ai),依次表示數列的第i項。

接下來M行,每行包含兩個整數li,ri,表示查詢的區間為[li,ri]

輸出格式

輸出包含M行,每行一個整數,依次表示每一次詢問的結果。


不錯的BLOG

 1 int init(){
 2     for(int i=1;i<=n;i++) dp[0][i]=a[i];
 3     for(int i=1;(1
<<i)<=n;i++){ 4 for(int j=1;j+(1<<i)-1<=n;j++){ 5 dp[i][j]=Max(dp[i-1][j],dp[i-1][j+(1<<(i-1))]); 6 } 7 } 8 return 0; 9 } 10 long long RMQ(long long l,long long r){ 11 int k=floor(log2(r-l+1)); 12 return max(dp[k][l],dp[k][r-(1<<k)+1
]); 13 return 0; 14 }