给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值。
线段树可以做到O(logN)查询,但这远远不够。
所以附上ST算法的模板:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=1e5+3; int n,m,a[maxn],d[maxn][23]; void ST_init() { for(int i=1;i<=n;i++)d[i][0]=a[i]; for(int j=1;(1<<j)<=n;j++) for(int i=1;i+(1<<j)-1<=n;i++) d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]); } int RMQ(int l,int r) { int k=0; while((1<<(k+1))<r-l+1)k++; return max(d[l][k],d[r-(1<<k)+1][k]); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); ST_init();int l,r; while(m--) { scanf("%d%d",&l,&r); printf("%d\n",RMQ(l,r)); } return 0; }
                    
                
                
            
        
浙公网安备 33010602011771号