voidST_prework(int a[], int n, int st[][])//a:数列。n:数列总的元素个数 { int i, j, t = log2(n); //数列总长度为n,j最大值就为t=log2(n) // 虽然t向下取整,但这点零头不影响后续求解。 for (i = 1; i <= n; i++) st[i][0] = a[i];//以i为头元素,长度为1(2^0)的子段最大元素值就是头元素本身 for (j = 1; j <= t; j++)//在外层枚举区间长度 { for (i = 1; i <= n - (1 << j) + 1; i++)//待求区间的右端点不超过n st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]); } }
intST_query(int l, int r, int st[][]) { int k = log2(r - l + 1);//以l为开头,长度为2的次方,且右端点不超过r的子段长度不超过2^k //k可以用倍增来求,用内置的log会更快 returnmax(st[l][k], st[r - (1 << k) + 1][k]); }