[蓝桥杯学习] 树状树组

lowbit操作

数字二进制表达中的最低位1以及后面所有的0,函数写法如下:

cpp 复制代码
int lowbit(int x){return x&-x;}

例如说,lowbit(0101100100) = (100)

lowbit(4) = 4 lowbit(6) = 2

时间复杂度o(1)

树状数组

应用

进行单点修改和区间查询,时间复杂度为O(logn)

结构

进行单点修改

修改t[i],然后 i=i+lowbit(i) ,修改t[i]

进行区间查询

查询区间和,就拆分成求前缀和,求(a,b),就拆成(1,b)-(1,a-1)

i=i-lowbit(i)

修改和查询函数的代码

注意,一定是 >0

例题

愉悦值的计算就是求区间和

有两个操作,修改和查询,使用树状数组的数据结构。

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 1e7;
using ll = long long;
ll a[N],t[N];
int n;

int lowbit(int x) {return x&-x;}

void update(int k,ll x)
{
  a[k] += x;
  for(int i = k ; i <= n ;i += lowbit(i)) t[i] += x;
}

ll getprefix(int k)
{
  ll res = 0;
  for(int i = k ; i > 0 ; i -= lowbit(i)) res += t[i];
  return res;
}

ll getsum(int l,int r)
{
  return getprefix(r) - getprefix(l-1);
}

ll oper(int k,int n)
{
  return (2*k-n-1)*a[k]-getsum(1,k-1)+getsum(k+1,n);
}


int main()
{
  // 请在此输入您的代码
  int m;
  cin >> n >> m;
  for(int i = 1 ; i <= n ; i++) 
  {
    ll x;
    cin >> x;
    update(i,x);
  }

  while(m--)
  {
    int op;
    cin >> op;
    if(op == 1)
    {
      int x;
      ll z;
      cin >> x;
      cin >> z;
      update(x,z-a[x]);
    }
    else 
    {
      int x;
      cin >> x;
      cout << oper(x,n) << '\n';
    }
  }

  return 0;
}
相关推荐
铅华尽40 分钟前
Nginx学习笔记
笔记·学习·nginx
架构文摘JGWZ8 小时前
FastJson很快,有什么用?
后端·学习
量子-Alex10 小时前
【多视图学习】显式视图-标签问题:多视图聚类的多方面互补性研究
学习
乔木剑衣10 小时前
Java集合学习:HashMap的原理
java·学习·哈希算法·集合
练小杰11 小时前
Linux系统 C/C++编程基础——基于Qt的图形用户界面编程
linux·c语言·c++·经验分享·qt·学习·编辑器
神探阿航11 小时前
第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
java·算法·蓝桥杯
皮肤科大白11 小时前
如何在data.table中处理缺失值
学习·算法·机器学习
皮肤科大白11 小时前
“““【运用 R 语言里的“predict”函数针对 Cox 模型展开新数据的预测以及推理。】“““
学习
汤姆和佩琦12 小时前
2025-1-21-sklearn学习(43) 使用 scikit-learn 介绍机器学习 楼上阑干横斗柄,寒露人远鸡相应。
人工智能·python·学习·机器学习·scikit-learn·sklearn
qq_5443291712 小时前
下载一个项目到跑通的大致过程是什么?
javascript·学习·bug