高级数据结构-树状数组

介绍

树状数组的推导

两个基础操作

模板-acwing795. 前缀和

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
int c[N]; int lowbit(int x){return x & -x;
}int query(int x){int ans = 0;for(; x; x -= lowbit(x)) ans += c[x];return ans;
}void add(int x,int y){for(; x <= N; x += lowbit(x)) c[x] += y;
}int main(){int n,m; scanf("%d%d",&n,&m);for(int i = 1; i <= n; i++){int num; scanf("%d",&num);add(i,num);}while(m--){int l,r; scanf("%d%d",&l,&r);printf("%d\n",query(r)-query(l-1));}return 0;
} 

模板-acwing5910. 求逆序对

​#include<bits/stdc++.h>
using namespace std;typedef long long LL;
const int N = 1e6+10;
LL c[N],a[N];int lowbit(int x)  // 返回末尾的1
{return x & -x;
}LL query(int x){LL ans = 0;for(; x; x -= lowbit(x)) ans += c[x];return ans;
}void add(int x,int y){for(; x <= N; x += lowbit(x)) c[x] += y;
}int main()
{LL ans = 0;int n; scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&a[i]);}//倒序扫描,找值比当前这个数小但是先进入树状数组的数,即1-(a[i]-1)的和,加入ans(根据逆序对的定义构造的)for(int i = n; i >= 1; i--){ans += query(a[i]-1)-query(0);add(a[i],1);}printf("%lld\n",ans);return 0;
}​

例题

A. 数列操作

思路

模板题,套树桩数组的模板即可。注意开long long

代码

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
long long c[N]; int lowbit(int x){return x & -x;
}long long query(int x){long long ans = 0;for(; x; x -= lowbit(x)) ans += c[x];return ans;
}void add(int x,int y){for(; x <= N; x += lowbit(x)) c[x] += y;
}int main(){long long n,m; scanf("%lld%lld",&n,&m);for(int i = 1; i <= n; i++){long long x; scanf("%lld",&x);add(i,x);}while(m--){long long t,idx,x,l,r; scanf("%lld",&t);if(t == 1){scanf("%lld%lld",&idx,&x);add(idx,x);}else{scanf("%lld%lld",&l,&r);printf("%lld\n",query(r)-query(l-1));}}return 0;
} 

 B. 数星星 Stars

思路

        这道题的求解思路跟逆序对那道题差不多,都是利用树状数组去查1-x的和,但是这道题要考虑好一种类似谈心的思路,就是他要找左下角的星星个数,他输入时是按照y增序,y相同时按照x增序给出,那么某个星星的等级就是x坐标1-x的星星个数,但是要注意的是这道题有可能会坐标会为0那么就会出现越界问题,所以每次要给x坐标+1,但是整体每个数的大小关系并不会改变。

代码

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
long long c[N],lv[N]; int lowbit(int x){return x & -x;
}long long query(int x){long long ans = 0;for(; x; x -= lowbit(x)) ans += c[x];return ans;
}void add(int x,int y){for(; x <= N; x += lowbit(x)) c[x] += y;
}int main(){int n; cin >> n;for(int i = 1; i <= n; i++){int x,y; cin >> x >> y;x++;int t = query(x);lv[t]++;add(x,1);}for(int i = 0; i < n; i++) cout << lv[i] << endl;return 0;
} 

C. 校门外的树

思路

        这道题因为是求某个区间内树的数量,树在区间内的具体位置是不知道的,所以用两个数组分别表示该点左侧树的数量和该点右侧树的数量,区间[a,b]内树的数量=b点左侧树的数量 – (a-1)点右侧树的数量。之所以是a-1点不是a点是因为要算上a点上的树。

代码

#include <bits/stdc++.h>
using namespace std;
int const N = 50010;
int n, m;
// 树状数组模板
int c1[N], c2[N];#define lowbit(x) (x & -x)
typedef long long LL;void add(int c[], int x, int v) {while (x < N) c[x] += v, x += lowbit(x);
}LL sum(int c[], int x) {LL res = 0;while (x) res += c[x], x -= lowbit(x);return res;
}//这道题因为是求某个区间内树的数量,树在区间内的具体位置是不知道的
//所以用两个数组分别表示该点左侧树的数量和该点右侧树的数量
//区间[a,b]内树的数量=b点左侧树的数量 – (a-1)点右侧树的数量。之所以是a-1点不是a点是因为要算上a点上的树。int main() {int k, l, r;scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) {scanf("%d%d%d", &k, &l, &r);if (k == 1)add(c1, l, 1), add(c2, r, 1); // c1记录左括号的个数,c2记录右括号的个数elseprintf("%d\n", sum(c1, r) - sum(c2, l - 1));}return 0;
}

D. 清点人数

思路

        模板题,直接套模板。开long long

代码

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
long long c[N],lv[N]; int lowbit(int x){return x & -x;
}long long query(int x){long long ans = 0;for(; x; x -= lowbit(x)) ans += c[x];return ans;
}void add(int x,int y){for(; x <= N; x += lowbit(x)) c[x] += y;
}int main(){int n,k; cin >> n >> k;for(int i = 1; i <= k; i++){char t;int m,p;cin >> t;if(t == 'A'){scanf("%d",&m);printf("%d\n",query(m));}else if(t == 'B'){scanf("%d%d",&m,&p);add(m,p);}else {scanf("%d%d",&m,&p);add(m,-p);}}return 0;
} 

 E. 简单题

思路

        这道题可能是这几道题中较难的一道,这道题如果不是取反操作的话,就是一道树状数组区间修改区间查询的题了,但是他是取反操作,我们就可以简化一下,不用像区间修改一样另开一个前缀和数组,接下来讲解本体思路:

        根据差分思想,可以在从1~l先取反一次,再在1~r+1取反一次就可以得到l-r取反了,取反操作就异或上1即可(^1),求某一位的值即从1~x的异或值就第x位的值。

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+10;
bool c[N]; 
int n,m; int lowbit(int x){return x & -x;
}bool query(int x){bool ans = 0;for(; x; x -= lowbit(x)) ans ^= c[x];return ans;
}void add(int x){for(; x <= N; x += lowbit(x)) c[x] ^= 1;
}void modify(int l, int r) // 原数组的区间修改 <- 差分数组的单点修改
{add(l);if (r != n)add(r+1);
}int main(){cin >> n >> m;for(int i = 1; i <= m; i++){char t;int x,l,r;cin >> t;if(t == '2'){scanf("%d",&x);printf("%d\n",query(x));}else{scanf("%d%d",&l,&r);modify(l,r);}}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489054.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港科技大学广州|智能交通学域博士招生宣讲会—湖南大学专场

香港科技大学广州&#xff5c;智能交通学域博士招生宣讲会—湖南大学专场 &#x1f559;时间&#xff1a;2024年12月17日&#xff08;星期二&#xff09;15:00 &#x1f3e0;地点&#xff1a;湖南大学二办公楼三楼学生就业指导中心329 &#x1f517;报名链接&#xff1a;http…

node利用路由搭建web实例

npm init npm i express body-parser cookie-parser 封装web实例 搭建路由 导出web 应用实例注册

MFC案例:基于对话框的简易阅读器

一、功能目标&#xff1a; 1.阅读txt文件 2.阅读时可以调整字体及字的大小 3.打开曾经阅读过的文件时&#xff0c;能够自动从上次阅读结束的位置开始显示&#xff0c;也就是能够保存和再次使用阅读信息。 4.对于利用剪贴板粘贴来的文字能够存储成txt文件保存。 5.显示…

端点鉴别、安全电子邮件、TLS

文章目录 端点鉴别鉴别协议ap 1.0——发送者直接发送一个报文表明身份鉴别协议ap 2.0——ap1.0 的基础上&#xff0c;接收者对报文的来源IP地址进行鉴别鉴别协议ap 3.0——使用秘密口令&#xff0c;口令为鉴别者和被鉴别者之间共享的秘密鉴别协议ap 3.1——对秘密口令进行加密&…

电脑技巧:Everything 1.5 版本重大更新​支持拼音搜索+全文搜索

目录 一、软件介绍 二、主要更新亮点 更快的搜索速度和拼音搜索 全文搜索功能 智能推荐功能 增强的过滤选项 改进的用户界面 更好的多语言支持 增强的安全性和隐私保护 三、总结 Everything 作为一款备受推崇的文件搜索工具&#xff0c;以其卓越的性能和简洁的用户界…

element左侧导航栏

由element组件搭建的左侧导航栏 预览: html代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><style> /*<!-- 调整页面背景颜色-->*/body{background-colo…

Datax可视化工具Datax-web安装部署

文章目录 一、Datax-web官网二、Datax-web介绍 1、Datax-web概述2、架构图3、系统环境要求4、特性支持 三、安装部署 1、环境准备2、Datax-web安装包准备 一、Datax-web官网 github&#xff1a;Datax-web gitee: Datax-web 二、Datax-web介绍 1、Datax-web概述 DataX Web…

node-js Express中间件

中间件介绍 什么是中间件 中间件其本质就是一个回调函数&#xff0c;可以像路由一样访问请求对象&#xff08;request&#xff09;和响应对象&#xff08;response&#xff09;。中间件的作用是什么 通过函数封装公共操作&#xff0c;简化代码中间件类型 - 全局中间件 - 路由中…

【数学】矩阵的逆与伪逆 EEGLAB

文章目录 前言matlab代码作用EEGLAB 中的代码总结参考文献 前言 在 EEGLAB 的使用中&#xff0c;运行程序时出现了矩阵接近奇异值&#xff0c;或者缩放错误。结果可能不准确。RCOND 1.873732e-20 的 bug&#xff0c;调查 EEGLAB 后发现是 raw 数据的问题。 matlab代码 A_1 …

TCP 的三次握手与四次挥手

TCP 的三次握手与四次挥手 TCP 协议&#xff0c;使用 TCP 的三次握手建立连接&#xff0c;使用四次挥手断开连接。 我们先看看基本的计算机网络中的TCP连接建立和断开的过程。 1.HTTP 三次握手 HTTP 的三次握手过程如下&#xff1a; 第一次握手&#xff08;SYN&#xff09;…

解锁前端开发速度的秘密武器【Vite】

在前端开发的江湖中&#xff0c;有人偏爱 Webpack 的强大与稳定&#xff0c;有人钟情于 Rollup 的轻量与高效。而 Vite&#xff0c;这个后来居上的工具&#xff0c;却以“极致的快”和“极简的易”赢得了开发者的芳心。众所周知万事都有缘由&#xff0c;接下来我们就来深度剖析…

【动态库.so | 头文件.hpp】基于CMake与CMakeList编写C++自定义库

前言 最近比较忙&#xff0c;其他系列教程得等到年后一起更&#xff01;请大家多多包涵&#xff01;&#xff01;相信各位在配置C环境和各类库的时候一定经常看到如下小连招 git clone https://github.com/opencv/opencv.git cd opencv mkdir build && cd build cma…

前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor

与框架无关 vue2-ace-editor有问题&#xff0c;ace拿不到&#xff08;brace&#xff09; 一些组件都是基于ace-builds或者brace包装的 不如直接用下面的&#xff0c;不如直接使用下面的 <template><div ref"editor" class"json-editor"><…

SpringMVC框架——入门

目录 一、三层框架和MVC 1. 三层架构 2. MVC模型 二、SpringMVC入门案例 1. SpringMVC的概述 2. SpringMVC的入门程序 3. 入门案例的执行过程分析 4. RequestMapping注解 一、三层框架和MVC 1. 三层架构 开发服务器端程序&#xff0c;一般都基于两种形式&#xff0c;一…

港口智慧应急管理平台:应急先锋,港航卫士

在风云变幻的港航世界&#xff0c;安全是永恒的基石。港口智慧应急管理平台宛如一位无畏的先锋&#xff0c;以智能化、数字化、信息化为利刃&#xff0c;借助 AI 与大数据的神奇力量&#xff0c;为港口保驾护航。 传统应急管理往往在事故发生后被动响应&#xff0c;而此平台却…

Prime2_解法二:openssl解密凭据

Prime2_解法二&#xff1a;openssl解密凭据 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担全…

恢复删除的文件:6个免费Windows电脑数据恢复软件

数据恢复软件可帮助您从众多存储设备中恢复损坏或删除的数据。您可以使用这些文件恢复软件来检索文件、文档、视频、图片等。这些应用程序支持多种标准文件格式&#xff0c;如 PNG、RTF、PDF、HTML、JPG、MP3 等。 经过超过 75 小时的研究&#xff0c;我分析了 25 最佳免费数据…

爬虫自动化之drissionpage+SwitchyOmega实现随时切换代理ip

本文介绍了如何使用DrizzlePage进行爬虫自动化,并重点讲解了首次启动时设置代理IP以及通过SwitchyOmega插件实现随时切换代理IP的方法。 安装一次,后面调用就不会再去安装了 下载地址:https://github.com/FelisCatus/SwitchyOmega/releases 这两个文件随便那个都可以,下载…

今天你学C++了吗?——C++中的类与对象(日期类的实现)——实践与知识的碰撞❤

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

kafka进阶_4.kafka扩展

文章目录 一、Controller选举二、Kafka集成2.1、大数据应用场景2.1.1、Flume集成2.1.2、Spark集成2.1.3、Flink集成 2.2、Java应用场景(SpringBoot集成) 三、Kafka常见问题3.1、Kafka都有哪些组件&#xff1f;3.2、分区副本AR, ISR, OSR的含义&#xff1f;3.3、Producer 消息重…