zoukankan      html  css  js  c++  java
  • 稀疏表(ST / Sparse Table)

    RMQ问题:

    给定一个序列,每次询问一个区间最小值 / 最大值。

    没有修改。

    //拿区间最大值来举例。
    memset(ans, -INF, sizeof(ans));
    
    for (int i = 1; i <= n; i++)
            ans[i][0] = a[i];
    
    for (int j = 1; (1<<j) <= n; j++) //枚举长度为2^j的区间
            for (int i = 1; i+(1<<j)-1 <= n; i++)  //枚举区间起点
                    ans[i][j] = max(ans[i][j-1], ans[i+(1<<(j-1))][j-1]);  
              //显然,长度为2^j的区间由2^(j-1)的区间更新。
    
    for (int i = 1; i <= q; i++)
    {
            int l, r, k = 0;
            scanf("%d%d", &l, &r);
            while((1<<(k+1)) <= r-l+1) k++;  
          //若2^k+1还是不超过所求区间的长度,那么说明k可以继续加1
            printf("%d
    ", max(ans[l][k], ans[r-(1<<k)+1][k]));  
          //两个区间可能有相交的部分,但由于是求最值,所以无影响。
    }
    

      

  • 相关阅读:
    第一次作业
    第四次作业
    第五次作业《构建之法》心得体会
    第三次作业
    第二次作业
    第一次作业
    个人简介
    读《构建之法》有感
    第四次博客园作业(2)
    第四次博客园作业(1)
  • 原文地址:https://www.cnblogs.com/ruthank/p/9460401.html
Copyright © 2011-2022 走看看