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

Posted Al_X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 为什么不问问万能的线段树呢?)

以上是关于NKOJ2325: 二分与分治:区间最值的主要内容,如果未能解决你的问题,请参考以下文章

hdu6070(分数规划/二分+线段树区间更新,区间最值)

模板动态最值

bzoj 3745 [Coci2015]Norma——序列分治

[hdu 5354] Bipartite Graph 分治 并查集

线段树分治总结(线段树分治,线段树,并查集,树的dfn序,二分图染色)

[HDOJ5289]Assignment(RMQ,二分)