• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
AC_Artist.zig_zag
然而我依然在补题、
博客园    首页    新随笔    联系   管理    订阅  订阅

关于树状数组区间最值

居然最近才发现BIT是可以用来求最值的233,道理和线段树差不多,因为树状数组里每个点存储的数据范围是[i-lowbit(i)+1,i],而任意一个区间都是可以被许多段这样的小区间所覆盖的,那么我们就可以用这些小区间的最值来更新所求区间的最值了。

 1 struct max_bit
 2 {
 3     int s[maxn];
 4     int num;
 5     void add(int x,int z)
 6     {
 7         for (int i=x;i<=num;i+=(i&-i)) s[i]=max(s[i],z);
 8     }
 9     int ask(int l,int r)
10     {
11         int tmp=-inf;
12         while (l<=r)
13         {
14             tmp=max(tmp,rain[r]);
15             for (r-=1;r-(r&-r)>=l;r-=(r&-r)) tmp=max(tmp,s[r]);
16         }
17         return tmp;
18     }
19     void clear()
20     {
21         memset(s,-0x3f,sizeof(s));
22     }
23 }mx;
MaxBIT

时间复杂度修改(O(nlogn)),查询O(logn),空间复杂度O(n),代码复杂度比ST表和线段树都要小。

AC without art, no better than WA !
posted @ 2015-08-18 18:55  Zig_zag  阅读(256)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3