码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-09 19:43:05      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:转化   存储   区间   http   none   math   问题   --   程序代码   

  一道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的范围内的最大值。预处理时间复杂度是技术分享图片,单次询问和单次修改复杂度为技术分享图片,空间复杂度为技术分享图片

  主程序代码:

技术分享图片
 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. 为什么不问问万能的线段树呢?)

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

标签:转化   存储   区间   http   none   math   问题   --   程序代码   

原文地址:http://www.cnblogs.com/Algorithm-X/p/8012180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!