acwing算法提高之数据结构--树状数组

目录

  • 1 介绍
  • 2 训练
  • 3 参考

1 介绍

本专题用来记录树状数组相关题目。

lowbit(x)操作,求数 x二进制表示中最低位的1的值,

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

树状数组:用来快速计算动态前缀和的数据结构。

c[x]的表示原数组以第x个数结尾,且区间长度为lowbit(x)的区间的和,即c[x - lowbit(x) + 1] ~ c[x]

在这里插入图片描述

树状数组支持两种操作:

  1. 单点修改,比如a[i] += x
  2. 区间查询,比如求a[l~r]的和

见上图,修改a[5]的值,则需要递次修改c[5], c[6], c[8]的值。那么修改操作的代码如下,

//a[x] += k
void add(int x, int k) {while (x <= n) {  // 不能越界。n就是最大值,总共n个数,编号分别为1,2,3...,nc[x] = c[x] + k;x = x + lowbit(x);}
}//或可以写成
void add(int x, int k) {for (int i = x; i <= n; i += lowbit(i)) {c[i] += k;}
}

见上图,查询前缀和a[1~5],则需要递次遍历c[5], c[4], c[0],将它们的值累加就是前缀和。那么求前缀和的代码如下,

int getsum(int x) {  // a[1]..a[x]的和int ans = 0;while (x >= 1) {ans = ans + c[x];x = x - lowbit(x);}return ans;
}//或可以写成
int getsum(int x) {int ans = 0;for (int i = x; i >= 1; i -= lowbit(i)) {ans += c[i];}return ans;
}

2 训练

题目1:241楼兰图腾

C++代码如下,

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;const int N = 200010;int n;
int a[N]; //a[x] = 2表示数x出现了2次
int tr[N];
int Greater[N], lower[N];int lowbit(int x) {return x & -x;
}void add(int x, int c) {for (int i = x; i <= n; i += lowbit(i)) tr[i] += c;
}int sum(int x) {int res = 0;for (int i = x; i; i -= lowbit(i)) res += tr[i];return res;
}int main() {scanf("%d", &n);for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);for (int i = 1; i <= n; ++i) {int y = a[i];Greater[i] = sum(n) - sum(y);lower[i] = sum(y - 1);add(y, 1);}memset(tr, 0, sizeof tr);LL res1 = 0, res2 = 0;for (int i = n; i; --i) {int y = a[i];res1 += Greater[i] * (LL)(sum(n) - sum(y));res2 += lower[i] * (LL)(sum(y - 1));add(y, 1);}printf("%lld %lld\n", res1, res2);return 0;
}

题目2:241一个简单的整数问题

C++代码如下,

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;const int N = 100010;int n, m;
int a[N];
LL c[N];int lowbit(int x) {return x & -x;
}void add(int x, int k) {for (int i = x; i <= n; i += lowbit(i)) c[i] += k;
}LL getsum(int x) {LL res = 0;for (int i = x; i >= 1; i -= lowbit(i)) res += c[i];return res;
}int main() {cin >> n >> m;for (int i = 1; i <= n; ++i) cin >> a[i];for (int i = 1; i <= n; ++i) add(i, a[i] - a[i-1]);for (int i = 0; i < m; ++i) {string op;cin >> op;if (op == "C") {int l, r, d;cin >> l >> r >> d;add(l, d);add(r + 1, -d);} else {int x;cin >> x;cout << getsum(x) << endl;}}return 0;
}

题目3:243一个简单的整数问题2

C++代码如下,

//MYANS
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;const int N = 100010;
LL a[N];
LL c1[N], c2[N];
int n, m;int lowbit(int x) {return x & -x;
}void add(LL c[], int x, LL k) {for (int i = x; i <= n; i += lowbit(i)) {c[i] += k;}return;
}LL getsum(LL c[], int x) {LL res = 0;for (int i = x; i >= 1; i -= lowbit(i)) {res += c[i];}return res;
}LL get_query(int x) {return getsum(c1, x) * (x + 1) - getsum(c2, x);
}int main() {cin >> n >> m;for (int i = 1; i <= n; ++i) {cin >> a[i];}for (int i = 1; i <= n; ++i) {int t = a[i] - a[i-1];add(c1, i, t);add(c2, i, (LL)t * i);}while (m--) {string op;cin >> op;if (op == "Q") {int l, r;cin >> l >> r;cout << (LL)get_query(r) - get_query(l - 1) << endl;} else {int l, r, d;cin >> l >> r >> d;add(c1, l, d), add(c1, r + 1, -d);add(c2, l, l * d), add(c2, r + 1, (r + 1) * -d);}}return 0;
}

题目4:244谜一样的牛

C++代码如下,

#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;int n;
int h[N];
int ans[N];
int tr[N];int lowbit(int x) {return x & -x;
}void add(int x, int c) {for (int i = x; i <= n; i += lowbit(i)) tr[i] += c;
}int sum(int x) {int res = 0;for (int i = x; i >= 1; i -= lowbit(i)) res += tr[i];return res;
}int main() {scanf("%d", &n);for (int i = 2; i <= n; ++i) scanf("%d", &h[i]);for (int i = 1; i <= n; ++i) tr[i] = lowbit(i);for (int i = n; i >= 1; --i) {int k = h[i] + 1;int l = 1, r = n;while (l < r) {int mid = l + r >> 1;if (sum(mid) >= k) r = mid;else l = mid + 1;}ans[i] = r;add(r, -1);}for (int i = 1; i <= n; ++i) printf("%d\n", ans[i]);return 0;
}

用平衡树做这道题,超时了,通过了 8/10个数据。C++代码如下,

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>using namespace std;const int N = 100010;
int a[N];
int res[N];
set<int> s;
int n;int main() {cin >> n;for (int i = 2; i <= n; ++i) {cin >> a[i];}   for (int i = 1; i <= n; ++i) s.insert(i);for (int i = n; i >= 1; --i) {int k = a[i];//平衡树中第k小的数auto it = s.begin();advance(it, k);res[i] = *it;s.erase(it);}for (int i = 1; i <= n; ++i) cout << res[i] << endl;return 0;
}

3 参考

树状数组-OI WiKi

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

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

相关文章

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1&#xff1a; 方法2&#xff1a; 3.c的调试 3.1调试方法一&#xff1a;先生成执行文件&#xff0c;再调试 3.2调试方法二&#xff1a;同时生成执行文件&#xff0c;调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

ZDOCK linux 下载(无需安装)、配置、使用

ZDOCK 下载 使用 1. 下载1&#xff09;教育邮箱提交申请&#xff0c;会收到下载密码2&#xff09;选择相应的版本3&#xff09;解压 2. 使用方法Step 1&#xff1a;将pdb文件处理为ZDOCK可接受格式Step 2&#xff1a;DockingStep 3&#xff1a;创建所有预测结构 1. 下载 1&…

ubuntu22.04 CH340/CH34x 驱动安装

CH34x驱动地址&#xff1a;CH341SER_LINUX.ZIP - 南京沁恒微电子股份有限公司 1、卸载旧驱动&#xff08;如果存在&#xff09; sudo rmmod ch341.ko 2、解压进入 driver 目录 unzip CH341SER_LINUX.ZIP cd CH341SER_LINUX/driver 3、编译 make 可能错误&#xff1a; make[1]…

WS-BAN模型(细粒度图像分类)

WS-BAN模型&#xff08;细粒度图像分类&#xff09; 摘要Abstract1. WS-BAN1.1 文献摘要1.2 背景1.3 创新点1.4 WS-BAN方法1.4.1 弱监督注意学习1.4.2 注意力丢弃 1.5 实验1.5.1 数据集1.5.2 实施细节1.5.3 对比试验结果 2. Transformer代码学习3. 细粒度图像分类代码复现 摘要…

ArcGIS Pro3.0软件破解版安装教程

软件名称&#xff1a;ArcGIS Pro 3.0 安装环境&#xff1a;Windows 软件大小&#xff1a;7.3GB 硬件要求&#xff1a;CPU2GHz&#xff0c;内存4G(或更高) 百度云下载链接 &#xff1a; https://pan.baidu.com/s/1CXy1MSwdQXdVnJoV2X422A 提 取 码 &#xff1a;r0w1 教学内…

mysql数据库navicat数据同步时误删除部分数据

背景介绍 听说过删库跑路被抓的&#xff0c;今天就碰到升级服务器&#xff08;Alibaba Cloud Linux ----> Ubuntu&#xff09;原因是taos3.2不支持Alibaba Cloud Linux系统&#xff01; 为了保险起见把现在这个数据库里的数据都备份一份&#xff0c;为了不耽误同事们继续开…

Zynq 7000 系列中的BootROM流程及BootROM Header简介

BootROM Code是在系统复位后执行的一段代码&#xff0c;用于配置PS&#xff08;处理器系统&#xff09;。本文将详细解释BootROM的启动过程及BootROM Header的格式。 1 BootROM流程 Zynq 7000在系统复位后进行配置。整个启动过程在图6-1中进行了说明&#xff0c;而BootROM的执…

公司服务器中的kafka消息中间件挂了,我是如何修复的?

今天的公司的system系统服务在运行过程中&#xff0c;提示连接不上kafuka的消息中间件。但是负责kafka的同事已经离职了&#xff0c;询问公司开发也不知道如何处理&#xff0c;我是如何重启kafka消息中间件使system系统服务正常运行&#xff1f; 查看kafka的安装位置 在下面的…

高扬程水泵的性能与应用领域 /恒峰智慧科技

在现代社会中&#xff0c;科技的发展为我们的生活带来了无数便利和可能性。其中&#xff0c;高扬程水泵作为一种高效能的水泵&#xff0c;其独特的设计使其在各个领域都有着广泛的应用&#xff0c;尤其是在森林消防中。 一、高扬程水泵的性能 1. 高扬程&#xff1a;高扬程水泵…

制造型企业 如何实现便捷的机台文件统一管理?

机台文件统一管理&#xff0c;这是生产制造型企业都需要去做的&#xff0c;机台文件需要统一管理的原因主要包括以下几点&#xff1a; 1、提高效率&#xff1a;统一管理可以简化文件的访问和使用过程&#xff0c;提高工作效率&#xff0c;尤其是在需要频繁访问或更新机台文件的…

在 Vue 中预加载组件

在 Vue 中&#xff0c;利用 VueRouter 可以轻松的实现两个组件&#xff08;页面&#xff09;之间的切换&#xff0c;有个常用的设计就是需要在登录页登录后跳转至一个内容页&#xff0c;通常的做法是在登录校验完成之后立即切换路由至内容页&#xff0c;接着内容页发送网络请求…

SpringBoot (批量)生成二维码工具类多种方法示例

一、引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version> </dependency><dependency><groupId>com.google.zxing</groupId><artifactId…

Jmeter05:配置环境变量

1 Jmeter 环境 1.1 什么是环境变量&#xff1f;path什么用&#xff1f; 系统设置之一&#xff0c;通过设置PATH&#xff0c;可以让程序在DOS命令行直接启动 1.2 path怎么用 如果想让一个程序可以在DOS直接启动&#xff0c;需要将该程序目录配置进PATH 1.3 PATH和我们的关系…

【自然语言处理】InstructGPT、GPT-4 概述

InstructGPT官方论文地址&#xff1a;https://arxiv.org/pdf/2203.02155.pdf GPT-4 Technical Report&#xff1a;https://arxiv.org/pdf/2303.08774.pdf GPT-4&#xff1a;GPT-4 目录 1 InstructGPT 2 GPT-4 1 InstructGPT 在了解ChatGPT之前&#xff0c;我们先看看Instr…

Three.js--》探秘虚拟现实VR展厅的视觉盛宴

今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 源码下载地址&#xff1a;地址 在线体验地址&#xff1a;地址 目录 项目搭建 初始化three代码 camera…

分布式系统事务一致性解决方案(基于事务消息)

参考&#xff1a;https://rocketmq.apache.org/zh/docs/featureBehavior/04transactionmessage/ 文章目录 概要错误的方案方案一&#xff1a;业务方自己实现方案二&#xff1a;RocketMQ 事务消息什么是事务消息事务消息处理流程事务消息生命周期使用限制使用示例使用建议 概要 …

单纯形投影算法

目录 一&#xff0c;任意点到平移坐标轴面的投影 1&#xff0c;求解目标 2&#xff0c;转换变量 3&#xff0c;求解结果 4&#xff0c;f(t)的导数 5&#xff0c;f(t)的最小值 二&#xff0c;任意点到标准单纯形的投影 1&#xff0c;求解目标 2&#xff0c;公式变形 3…

制作一个RISC-V的操作系统十四-任务同步和锁

文章目录 并发与同步临界区和锁锁死锁解决死锁自旋锁&#xff08;spin lock&#xff09;原子性问题原子操作实现amoswap.w.aq例子 另一种方法自旋锁的注意事项代码其他同步技术 并发与同步 控制流&#xff1a;可理解为任务或进程 中断也可以理解为一个切换到另一个任务&#…

LeetCode 226.翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例…

CMake+qt+Visual Studio

#使用qt Creator 创建Cmake 项目,使用Cmake Gui 生成sln 工程&#xff0c;使用Visual Studio 开发 ##使用qt Creator 创建CMake项目 和创建pro工程的步骤一致&#xff0c;只是在选择构建系统的步骤上选择CMake,接下来步骤完全相同 工程新建完成之后&#xff0c;构建cmake 项…