一道RMQ(Range Minimum/Maximum Query)问题,顺便复习了一遍B.I.T(Binary Index Tree)。
lowbit(x)的返回值是x转化为二进制后,最后一个1的位置代表的数值。
1 int lowbit(int x) 2 { 3 return x&(-x); 4 }
树状数组BIT[i]里面存储从i-lowbit(i)+i到i的范围内的最大值。预处理时间复杂度是,单次询问和单次修改复杂度为,空间复杂度为。
主程序代码:
1 int main() 2 { 3 int n, q; 4 scanf("%d%d", &n, &q); 5 for (int i = 1; i <= n; ++i) 6 scanf("%d", &nums[i]); 7 for (int i = 1; i <= n; ++i) 8 { 9 BIT[i] = nums[i]; 10 for (int j = i-1; j > i - lowbit(i); j-=lowbit(j)) 11 { 12 BIT[i] = max(BIT[i], BIT[j]); 13 } 14 } 15 int l, r; 16 for (int i = 0; i < q; ++i) 17 { 18 scanf("%d%d", &l, &r); 19 int Max = 0; 20 for (int i = r; i >= l;) 21 { 22 if (i - lowbit(i) < l) 23 { 24 Max = max(Max, nums[i]); 25 --i; 26 } 27 else 28 { 29 Max = max(Max, BIT[i]); 30 i -= lowbit(i); 31 } 32 } 33 printf("%d ", Max); 34 } 35 }
(P.S. 为什么不问问万能的线段树呢?)