首页 > 其他分享 >树状数组入门

树状数组入门

时间:2024-04-21 19:35:41浏览次数:17  
标签:节车厢 return 入门 树状 int lowbit sum 数组 treeArr

树状数组

image
下标记得是从1开始,本节点id通过加lowbit可以访问到父节点的id,用于点修。
本节点id减去lowbit则是查看左边第一个比自己高一级的节点id,比如7会查到6,6会查到4,这样子累加此三个的值就可以得到前七个的前缀和。

int treeArr[M] = {0}; // start from 1
int lowbit(int x) {
    return x & (-x);
}
void change(int i, int x){  // add x on ith arrry
    while (i < M) {
        treeArr[i] += x;
        i += lowbit(i);
    }
}

int query(int i){
    int sum=0;
    while(i >= 1) {
        sum += treeArr[i];
        i -= lowbit(i);
    }
    return sum;
}

例题(from acwing1267)

NK 中学组织同学们去五云山寨参加社会实践活动,按惯例要乘坐火车去。
由于 NK 中学的学生很多,在火车开之前必须清点好人数。
初始时,火车上没有学生,当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。
年级主任走到第 m 节车厢时,他想知道前 m 节车厢上一共有多少学生。
他没有调头往回走的习惯,也就是说每次当他提问时,m 总会比前一次大。

输入格式

第一行两个整数 n,k,表示火车共有 n节车厢以及 k个事件。
接下来有 k行,按时间先后给出 k个事件,每行开头都有一个字母 A,B或 C。
如果字母为 A,接下来是一个数 m,表示年级主任现在在第 m 节车厢;
如果字母为 B,接下来是两个数 m,p,表示在第 m 节车厢有 p 名学生上车;
如果字母为 C,接下来是两个数 m,p,表示在第 m 节车厢有 p 名学生下车。
学生总人数不会超过 10^5。

输出格式

对于每个事件 A,输出一行,一个整数,表示年级主任的问题的答案。

#include<iostream>
using namespace std;
const int M = 500003;
// Binary Indexed Trees
int treeArr[M] = {0}; // start from 1
int lowbit(int x) {
    return x & (-x);
}
void change(int i, int x){  // add x on ith arrry
    while (i < M) {
        treeArr[i] += x;
        i += lowbit(i);
    }
}

int query(int i){
    int sum=0;
    while(i >= 1) {
        sum += treeArr[i];
        i -= lowbit(i);
    }
    return sum;
}

int main(){
    int n,k;
    cin>>n>>k;
    for (int i=0; i<k; i++) {
        char c;
        int a, b;
        cin>>c;
        if (c == 'A') {
            cin>>a;
            cout<<query(a)<<endl;
        } else if (c =='B') {
            cin>>a>>b;
            change(a, b);
        } else {
            cin>>a>>b;
            change(a, -b);
        }
    }
    return 0;
}

标签:节车厢,return,入门,树状,int,lowbit,sum,数组,treeArr
From: https://www.cnblogs.com/fireinstone/p/18149372

相关文章

  • jfinal enjoy模板入门
    用途用于渲染需要多次重复的sql以及程序代码入门示例取自文件importcom.jfinal.template.Engine;importcom.jfinal.template.Template;importjava.util.HashMap;importjava.util.Map;publicclassEnjoyTemplateDemo{publicstaticvoidmain(String[]args)......
  • 在React中的函数组件和类组件——附带示例的对比
    在React中,创建组件有两种主要方式:函数组件和类组件。每种方式都有自己的语法和用例,尽管随着ReactHooks的引入,它们之间的差距已经显著缩小。但选择适当的组件类型对于构建高效和可维护的React应用程序仍然非常关键。在本文中,我们将探讨函数和类组件之间的基本区别,清楚地理解它们......
  • Kubernetes 入门、简介、架构、应用场景
    概述Kubernetes是一个开源的容器编排平台,它提供了一种方便管理和部署容器化应用程序的方式。下面是Kubernetes的入门、简介和架构。Kubernetes是一种用于自动部署、扩展和管理容器化应用程序的开源平台。它最初由Google开发,并在2014年开源发布,现已成为CNCF(CloudNativeCom......
  • kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ consumer实战
    1、上一节课我们学习了MQTTproducer生产者步骤,MQTTconsumer消费者步骤。该步骤可以从支持MRQTT协议的中间件获取数据,该步骤和kafkaconsumer一样可以处理实时数据交互,如下图所示: 2、双击步骤打开MQTTconsumer配置窗口,如下图所示:Stepname:自定义步骤名称。Transformat......
  • kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ producer 实战
    1、MQTT介绍MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,设计用于连接低带宽、高延迟或不可靠网络的设备。MQTT是基于发布/订阅模式(Publish/Subscribe)的协议,其中设备可以发布消息到一个主题(Topic),其他设备可以订阅这个主题以接收相关消息。这种模式......
  • 店铺营业状态开发+redis入门
      Redis也是数据库,也是用来存储数据的,有五种常用数据,redis是把数据存储到内存中,而mysql是把数据以数据文件的方式存到磁盘上  热点数据:在某个特定时间点,会有大量用户访问他们redis数据库是对MySQL数据库的补充 使用此命令启动redis然后通过客户端连接本地redis......
  • 三次答题判题程序练习让你入门Java。
    (1)前言本阶段三次题目集涵盖了从基础编程概念到较复杂算法设计等多个知识点。题量适中,难度呈梯度上升,从简单的数据结构与算法实现到复杂的问题求解,逐步挑战学生的编程能力。第一次题目集主要考察基本语法、数据类型和简单的控制结构;第二次题目集则增加了数组、链表等数据结构的应......
  • 发转数组的操作
    publicclassDemo4{publicstaticvoidmain(String[]args){int[]arrays={1,2,3,4,5};//printArrary(arrays);//JDK1.5,没有下标//for(intarray:arrays){//System.out.println(array);//array代表数组的数值int[]reverse=reverse(arrays);printArrary(re......
  • 中间件 ZK分布式专题与Dubbo微服务入门 8-6 使用tomcat启动dubbo服务
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12744 1重点关注1.1本节内容使用tomcat启动dubbo服务tomcat启动dubbo服务的弊端    2课程内容2.1tomcat启动dubbo服务的弊端tomcat本身也是软件,占用内存  ......
  • R语言入门与数据分析
    课程介绍R是免费的,R是一个全面的统计研究平台,提供了各式各样的数据分析技术,R拥有顶尖的绘图功能1-9数据分析的内容,学习R的目的10-15R的基本操作16-17R的数据结构和操作,最基础最重要28-33R对文件的操作数据分析数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物......