NKOJ2325: 二分与分治:区间最值

  一道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 }
View Code

  树状数组BIT[i]里面存储从i-lowbit(i)+i到i的范围内的最大值。预处理时间复杂度是O(N\log N),单次询问和单次修改复杂度为,空间复杂度为

  主程序代码:

 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\n", Max);
34     }
35 }
View Code

  (P.S. 为什么不问问万能的线段树呢?)

posted @ 2017-12-09 17:52  Al_X  阅读(159)  评论(0编辑  收藏  举报