当前位置: 首页 > news >正文

数据结构<1>——树状数组

树状数组,也叫Fenwick Tree和BIT(Binary Indexed Tree),是一种支持单点修改区间查询的,代码量小的数据结构。

那神马是单点修改和区间查询?我们来看一道题。

洛谷P3374(模板): 在本题中,单点修改就是将某一个数加上x的操作,区间查询就是求出某区间每一个数的和的操作,这下明白了吧。

下面来解释一下树状数组的工作原理。先看一张图(来源于OI-Wiki)

Tips:别找了,点一下"图"那个字就有了。

我们发现,树状数组总能将一段前缀拆成不多于log n段区间,使得这几段区间的信息是已知的。因此,我们只用合并这些区间的信息,就可以得到答案。因此,时间复杂度从\Theta (n)变成\Theta (log n),效率大大提高。

管辖区间

我们观察刚刚的图发现,每个c_{i}相当于一个小leader,掌管自己的范围。那这个范围是多少呢?我们规定c_{i}管辖的区间长度为2^{k},其中k为x的二进制表示中,最低位的1所在的二进制位数。而2^{k}为x的二进制表示中,最低位的1以及后面所有0组成的数。即c_{x}管辖的区间是[x-lowbit(x)+1,x]注意:lowbit(x)表示这个1和后面所有0组成的2^{k}

下面附上OI-Wiki中对lowbit(x)的原理的解释(其实是我不会解释)

x 的二进制所有位全部取反,再加 1,就可以得到 -x 的二进制编码。例如, 的二进制编码是 110,全部取反后得到 001,加 1 得到 010

设原先 x 的二进制编码是 (...)10...00,全部取反后得到 [...]01...11,加 1 后得到 [...]10...00,也就是 -x 的二进制编码了。这里 x 二进制表示中第一个 1x 最低位的 1

(...)[...] 中省略号的每一位分别相反,所以 x & -x = (...)10...00 & [...]10...00 = 10...00,得到的结果就是 lowbit

//lowbit的实现
int lowbit(int x){return x&(-x);
}

lowbit可以说是一个很经典的二进制运算了。

区间查询

经过上面的分析,我们可以知道回答区间查询的步骤了:

·c_{x}往前跳,一直让x-lowbit(x)就行了。

· 如果x=0就结束循环

· 将跑到的c_{x}累加

实现如下↓:

int get_sum(int x){int sum=0;while(x>0){sum+=c[x];x-=lowbit(x);}return sum;
}

单点修改

也很简单。

· 先修改c_{x}

· 然后一直让让x+lowbit(x)

· 如果x=n就结束循环

实现如下↓:

void modify(int x,int y){while(x<=n){c[x]+=y;x+=lowbit(x);}
}

洛谷P3374(模板):

那这题就很easy啦~

#include <bits/stdc++.h>
using namespace std;
int c[maxn];
int n,m;
int lowbit(int x){return x&(-x);
}
void modify(int x,int y){while(x<=n){c[x]+=y;x+=lowbit(x);}
}
int get_sum(int x){int res=0;while(x>0){res+=c[x];x-=lowbit(x);}return res;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){int x;cin>>x;modify(i,x);}for(int i=1;i<=m;i++){int op,x,y;cin>>op>>x>>y;if(op==1)modify(x,y);if(op==2)cout<<get_sum(y)-get_sum(x-1)<<endl;}return 0;
}

别走啊,这不得在找几题练练?

逆序对:

基础题。现在按照序列从左到右将数据的值对应的位置的数加一,代表又有一个数出现。因此,在循环到第i项时,前i-1项已经加入到树状数组内了,树状数组内比a_{i}大的都会与a_{i}构成逆序对,因为它们一定出现的更早,所以产生的逆序对数量为i-query(a_{i})。要注意的是,我们需要进行离散化,因为根据a_{i}建树确实不够。然后就是代码部分啦。

#include <bits/stdc++.h>
using namespace std;
pair<long long,long long> a[maxn];
long long b[maxn],c[maxn];
int n;
int lowbit(int x){return x&(-x);
}
void modify(int x){while(x<=n){c[x]++;x+=lowbit(x);}
}
int get_sum(int x){int sum=0;while(x>0){sum+=c[x];x-=lowbit(x);}return sum;
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i].first;a[i].second=i;}sort(a+1,a+n+1);for(int i=1;i<=n;i++)b[a[i].second]=i;long long ans=0;for(int i=n;i;i--){ans+=get_sum(b[i]);modify(b[i]);}cout<<ans<<endl;return 0;
}

当然,用归并也是Ok的。

火柴排队:

一道非常非常经典的题目。我们乍一看,就是让我们最小化\sum_{i=1}^{n} (a_{i}-b_{i})^{2},也就是最小化a_{i}-b_{i},也就是a序列第k大的元素必须和序列b中第k大的元素的位置必须一样。OK,那我们把a,b离散化,问题变成了b序列要交换几次可以令其等于a。我们令id_{a_{i}}=b_{i},相当于以a_{i}为关键字对序列b_{i}排序,如果a和b一样,那么q_{i}=i。那么我们需要让q升序排列。问题又变成,将原本乱的 q序列升序排列的最少交换次数。

诶,这不就是逆序对吗?

用树状数组或归并即可。这里给归并的代码,树状数组的参考上面P1908的代码。

#include <bits/stdc++.h>
using namespace std;
int a[maxn],b[maxn];
int c[maxn],d[maxn];
int num1[maxn],num2[maxn];
int calc[maxn];
long long ans=0;
int tmp[maxn];
void msort(int l,int r){if(l==r)return;int mid=(l+r)>>1;msort(l,mid);msort(mid+1,r);int i=l,j=mid+1;int k=l;while(i<=mid && j<=r){if(a[i]<=a[j])tmp[k++]=a[i++];else{tmp[k++]=a[j++];ans+=mid-i+1;ans%=MOD;}}while(i<=mid)tmp[k++]=a[i++];while(j<=r)tmp[k++]=a[j++];for(int i=l;i<=r;i++)a[i]=tmp[i];
}
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];c[i]=a[i];}for(int i=1;i<=n;i++){cin>>b[i];d[i]=b[i];}sort(d+1,d+n+1);for(int i=1;i<=n;i++)num1[d[i]]=i;sort(c+1,c+n+1);for(int i=1;i<=n;i++)num2[c[i]]=i;for(int i=1;i<=n;i++)calc[num1[b[i]]]=i;for(int i=1;i<=n;i++)a[i]=calc[num2[a[i]]];msort(1,n);cout<<ans%MOD<<endl;return 0;
}

别忘了取模哦。

The Last Problem:ABC157E

此题一看就是树状数组。但是由于有26个字母,我们要建26个树状数组,每一个存放该字母出现的位置。这样,在询问的时候,直接查询每一个树状数组的[l,r]的和,如果这个和>0,那么就把 ans加1,最后输出即可。

#include <bits/stdc++.h>
using namespace std;
int c[26][500005];
int lowbit(int x){return x&(-x);
}
void update(int c[],int x,int val){while(x<=500000){c[x]+=val;x+=lowbit(x);}
}
int getsum(int c[],int x){int sum=0;while(x>0){sum+=c[x];x-=lowbit(x);}return sum;
}
int main(){int n;cin>>n;string str;cin>>str;str=' '+str;for(int i=1;i<=n;i++)update(c[str[i]-'a'],i,1);int q;cin>>q;while(q--){int op;cin>>op;if(op==1){int x;char ch;cin>>x>>ch;update(c[str[x]-'a'],x,-1);update(c[ch-'a'],x,1);str[x]=ch;}if(op==2){int l,r;cin>>l>>r;int ans=0;for(int i=0;i<26;i++){if(getsum(c[i],r)-getsum(c[i],l-1))ans++;}cout<<ans<<endl;}}return 0;
}

Ok,以上就是本期的全部内容了。我们下期再见!

温馨提示:本期的所有代码都有问题,请不要无脑Ctrl C+Ctrl V(你会挂的很惨),看懂了自己写一遍

相关文章:

数据结构<1>——树状数组

树状数组&#xff0c;也叫Fenwick Tree和BIT(Binary Indexed Tree)&#xff0c;是一种支持单点修改和区间查询的&#xff0c;代码量小的数据结构。 那神马是单点修改和区间查询&#xff1f;我们来看一道题。 洛谷P3374(模板): 在本题中&#xff0c;单点修改就是将某一个数加上…...

Servlet生命周期

第一阶段&#xff1a; init&#xff08;&#xff09;初始化阶段 当客户端想Servlet容器&#xff08;例如Tomcat&#xff09;发出HTTP请求要求访问Servlet时&#xff0c;Servlet容器首先会解析请求&#xff0c;检查内存中是否已经有了该Servlet对象&#xff0c;如果有&#xff…...

npm i 报一堆版本问题

1&#xff0c;先npm cache clean --force 再下载 插件后缀加上 --legacy-peer-deps 2&#xff0c; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz failed, reason…...

Linux设备管理模型-01:基础数据结构

文章目录 1. 设备管理模型2. 基本数据结构2.1 kobject2.2 kset 1. 设备管理模型 设备模型是内核提供的一个编写驱动的架构。 设备管理是设备-总线-驱动结构。 linux中的设备是由树状模型组织的&#xff0c;从sysfs中可以查看树状结构。 他本身实现了&#xff1a; 电源管理热…...

opencv#32 可分离滤波

滤波的可分离性 就是将一个线性滤波变成多个线性滤波&#xff0c;这里面具体所指的是变成x方向的线性滤波和y方向的线性滤波。无论先做x方向的滤波还是y方向滤波&#xff0c;两者的叠加结果是一致的&#xff0c;这个性质取决于滤波操作是并行的&#xff0c;也就是每一个图像在滤…...

android 导航app 稳定性问题总结

一 重写全局异常处理&#xff1a; 1 是过滤掉一些已知的无法处理的 问题&#xff0c;比如TimeoutException 这种无法根除只能缓解的问题可以直接catch掉 2 是 一些无法继续的问题可以直接杀死重启&#xff0c;一些影响不是很大的&#xff0c;可以局部还原 比如&#xff1a; p…...

第11次修改了可删除可持久保存的前端html备忘录:将样式分离,可以自由秒添加秒删除样式

第11次修改了可删除可持久保存的前端html备忘录&#xff1a;将样式分离&#xff0c;可以自由秒添加秒删除样式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"…...

hcip高级网络知识

一&#xff1a;计算机间信息传递原理 抽象语言----编码 编码---二进制 二进制---转换为电流&#xff08;数字信号&#xff09; 处理和传递数字信号 二&#xff1a;OSI--七层参考模型 ISO--1979 规定计算机系统互联的组织&#xff1a; OSI/RM ---- 开放式系统互联参考模型 --- 1…...

常用电子器件学习——MOS管

MOS管介绍 MOS&#xff0c;是MOSFET的缩写。MOSFET 金属-氧化物半导体场效应晶体管&#xff0c;简称金氧半场效晶体管&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET&#xff09;。 一般是金属(metal)—氧化物(oxide)—半导体(semiconductor)场效应晶…...

System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误

目录 背景: 过程: SQL Express的认识: 背景: 正在运行程序的时候&#xff0c;我遇到一个错误提示&#xff0c;错误信息如下&#xff0c;当我将错误信息仔细阅读了一番&#xff0c;信息提示的很明显&#xff0c;错误出现的来源就是连接数据库代码这块string connStr "s…...

数据库(SQL语句:DMLDQL)

目录 有关数据表的DML操作 1.1 INSERT 语句 1.2 REPLACE 语句 replace语句的语法格式&#xff08;三种&#xff09; REPLACE 语句 和 INSERT 语句的区别 1.3 DELETE 语句 | | TRUNCATE 语句 DELETE TRUNCATE DROP 1.4 UPDATE 数据 1.5 SELECT 语句 &#xff08;DQL数…...

AnimatedDrawings:让绘图动起来

老样子&#xff0c;先上图片和官网。这个项目是让绘制的动画图片动起来&#xff0c;还能绑定人体的运动进行行为定制。 快速开始 1. 下载代码并进入文件夹&#xff0c;启动一键安装 git clone https://github.com/facebookresearch/AnimatedDrawings.gitcd AnimatedDrawingspip…...

红黑树浅浅学习

红黑树浅浅学习 红黑树概念红黑树平衡性调整 红黑树概念 二叉树&#xff1a;二叉树是每个节点最多有两个子树的树结构。二叉查找树&#xff1a;又称“二叉搜索树”&#xff0c;左孩子比父节点小&#xff0c;右孩子比父节点大&#xff0c;还有一个特性就是”中序遍历“可以让结…...

QGraphicsView 如何让图形大小适配窗口

1. setSceneRect 做什么用&#xff1f; setSceneRect是一个Qt中的函数&#xff0c;用于设置QGraphicsView中的场景矩形&#xff08;QRectF&#xff09;。 QGraphicsView是一个用于显示和编辑图形场景的控件&#xff0c;而setSceneRect函数用于设置场景矩形&#xff0c;即指定…...

sqlmap使用教程(3)-探测注入漏洞

1、探测GET参数 以下为探测DVWA靶场low级别的sql注入&#xff0c;以下提交方式为GET&#xff0c;问号&#xff08;?&#xff09;将分隔URL和传输的数据&#xff0c;而参数之间以&相连。--auth-credadmin:password --auth-typebasic &#xff08;DVWA靶场需要登录&#xf…...

期待已久!阿里云容器服务 ACK AI 助手正式上线

作者&#xff1a;行疾 大模型技术的蓬勃发展持续引领 AI 出圈潮流&#xff0c;各行各业都在尝试采用 AI 工具实现智能增效。 2023 年云栖大会上&#xff0c;阿里云容器服务团队正式发布 ACK AI 助手&#xff0c;带来大模型增强智能诊断&#xff0c;帮助企业和开发者降低 K8s …...

[BUG] Authentication Error

前言 给服务器安装了一个todesk&#xff0c;但是远程一直就是&#xff0c;点击用户&#xff0c;进入输入密码界面&#xff0c;还没等输入就自动返回了 解决 服务器是无桌面版本&#xff0c;或者桌面程序死掉了&#xff0c;重新安装就好 sudo apt install xorg sudo apt inst…...

23种设计模式概述

学习设计模式对我们有什么帮助&#xff1f; 1.提高代码质量和可维护性&#xff1a;设计模式是经过验证的解决方案&#xff0c;有助于解决常见的设计问题。使用设计模式可以减少代码冗余&#xff0c;增强代码的可读性和可维护性&#xff0c;并提高代码的可靠性。 2.提升开发效率…...

英文阅读-LinkedIn‘s Tips for Highly Effective Code Review

LinkedIn的CR技巧 LinkedIn团队CodeReview经验与方法&#xff0c;原文来自https://thenewstack.io/linkedin-code-review/ 总结 Do I Understand the “Why”? 在提交pr的同时需要描述本次修改的“动机”&#xff0c;有助于提高代码文档质量。 Am I Giving Positive Feedbac…...

性能优化-高通的Hexagon DSP和NPU

原文来自【 Qualcomm’s Hexagon DSP, and now, NPU 】 本文主要介绍Qualcomm Hexagon DSP和NPU&#xff0c;这些为处理简单大量运算而设计的硬件。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xf…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...