ST演算法求最值:
阿新 • • 發佈:2018-12-10
const int maxn=50005; int a[maxn],dp[maxn][30],d[maxn][30]; void rmq(){ for(int i=1;i<=n;i++){dp[i][0]=a[i];d[i][0]=a[i];} for(int j=1;(1<<j)<=n;j++){ for(int i=1;i+(1<<j)-1<=n;i++){ dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]); } } } int query1(int l,int r)//min { int k=0; while ((1<<(k+1))<=r-l+1)k++; return min(dp[l][k],dp[r-(1<<k)+1][k]); } int query2(int l,int r)//max { int k=0; while ((1<<(k+1))<=r-l+1) k++; return max(d[l][k],d[r-(1<<k)+1][k]); }