zoukankan      html  css  js  c++  java
  • 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(Nlog 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
    ", Max);
    34     }
    35 }
    View Code

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

  • 相关阅读:
    蜂窝网格的坐标以及寻路
    unity3d 第三人称视角的人物移动以及相机控制
    基本HTML结构
    平衡二叉树
    STL基础复习
    递归
    unity 傅老师学习
    blender基础操作
    最小生成树
    最短路径
  • 原文地址:https://www.cnblogs.com/Algorithm-X/p/8012180.html
Copyright © 2011-2022 走看看