树状数组的三种代码模板

下标从一开始。

所有奇数等于本身,偶数/2等于所在层数。

二进制末尾有几个0就在第几层。

 

每一个树状数组中表示的都是这么一个区间的和,左开右闭。

 

写成lowbit(x),返回的就是2^k,k就是末尾有几个0。

 

这是求和代码

 

单点修改


 

这是单点修改,区间查询的代码:

#include<iostream>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
using ll = long long;
const int N = 1e5 + 9;
int n, m, a[N], tr[N];
// O(log2n)
// 树状数组解决:单点修改以及区间查询(常考),区间修改以及单点查询(配合差分转化为第一种情况),区间修改以及区间查询(配合差分转化为第一种情况)
// 注意下标一定要从1开始
// 树状树状的所有的奇数和原数组相等(树状数组的第0层)
// c[x]:x的二进制表示最后有k个连续的0,就在第k层
// c[x] 表示的和的范围:(x - 2^k, x],也就是(x - lowbit(x), x]
// lowbit(x) = x & -x = 2^k
// 所以要求x的前缀和需要递归求解:
// for (int i = 0; i>0; i -= lowbit(i)) res += c[i];
// 修改值后的前缀和:A[x] + v
// for (int i = x; i <= n; i += lowbit(i)) c[i] += v; 
// 上述两个循环时间复杂度都是O(log2n)

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

void add(int x, int v)
{
    for (int i = x; i <= n; i += lowbit(i)) tr[i] += v;
}

int query(int x)
{
    int res = 0;
    for (int i = x; i > 0; i -= lowbit(i)) res += tr[i];
    return res;
}


int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    
    cin >> n >> m;
    
    for (int i = 1; i <= n; ++i) cin >> a[i];
    for (int i = 1; i <= n; ++i) add(i, a[i]);
    
    while (m--)
    {
        int k, x, y; cin >> k >> x >> y;
        
        if (k == 0) cout << query(y) - query(x - 1) << '\n';
        else add(x, y);// 在第x位置上加上一个y
    }
    
    return 0;
}



 

这是区间修改,单点查询的代码:

#include<iostream>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<tuple>
#include<set>
#include<bitset>
#include<unordered_map>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int N = 1e5 + 9, mod = 998244353, INF = 0x3f3f3f3f, M = 1, P = 13331;
const double eps = 1e-8;
#define x first
#define y second
typedef pair<int, int> PII;
int T, n, m, k, len, res, e[M], ne[M], h[N], w[M], idx, dist[N], f[N][2], a[N], r, c;

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

void add(int x, int v) {
    for (int i = x; i <= n; i += lowbit(i)) h[i] += v;
}

int query(int x) {
    int res = a[x];
    for (int i = x; i; i -= lowbit(i)) res += h[i];
    return res;
}

// 区间修改,单点查询

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    
    cin >> n >> m;
    
    for (int i = 1; i <= n; ++i) cin >> a[i];
    
    char op;
    while (m--) {
        cin >> op;
        if (op == 'Q') {
            int x; cin >> x;
            cout << query(x) << '\n';
        }
        
        else {
            int l, r, v; cin >> l >> r >> v;
            add(l, v), add(r + 1, -v);
        }
    }
    
    return 0;
}

区间修改,区间查询:

 

#include<iostream>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<tuple>
#include<set>
#include<bitset>
#include<unordered_map>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int N = 2e5 + 9, mod = 998244353, INF = 0x3f3f3f3f, M = 1, P = 13331;
const double eps = 1e-8;
#define x first
#define y second
typedef pair<int, int> PII;
ll T, n, m, k, len, res, e[M], ne[M], h[N], w[M], idx, dist[N], f[N][2], a[N], r, c;
ll c1[N], c2[N];


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

void add(ll x, ll v) {
    for (int i = x; i <= n; i += lowbit(i)) {
        c1[i] += v;
        c2[i] += x * v;
    }
}

ll query(ll x) {
    ll res = 0;
    for (int i = x; i; i -= lowbit(i)) res += (x + 1) * c1[i] - c2[i];
    return res;
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    cin >> n >> m;

    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        add(i, a[i] - a[i - 1]);
    }

    char op;
    while (m--) {
        cin >> op;
        if (op == 'Q') {
            ll l, r; cin >> l >> r;
            cout << query(r) - query(l - 1) << '\n';
        }

        else {
            ll l, r, v; cin >> l >> r >> v;
            add(l, v), add(r + 1, -v);
        }
    }

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

案例 | 华院计算x第一财经:我和我的数智人唱双簧

创新关乎命运&#xff0c;科技引领未来。生成式人工智能(AIGC)给传媒行业发展带来严峻挑战的同时&#xff0c;也带来千载难逢的重大发展机遇。2024年政府工作报告中提出&#xff0c;要深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;打造具有国际…

龙泉寺扫地僧:十年坚持打造轻量级浏览器内核

王斌&#xff0c;网名龙泉寺扫地僧。作为一个独立开发者&#xff0c;他专注于浏览器内核研究十余年。他主要从事 MiniBlink 项目的工作&#xff0c;旨在创建一个精简且高效的浏览器内核&#xff0c;应对 Chromium 庞大的体积和内存占用问题。 龙泉寺扫地僧在谈及做 MiniBlink 的…

10个你必须知道的浏览器指纹检测工具,保护你的隐私安全

在当前的数字时代&#xff0c;个人隐私保护变得越来越重要&#xff0c;特别是对于互联网用户来说。有一种叫做“浏览器指纹”的技术&#xff0c;它能悄悄收集我们使用的浏览器和设备的各种细节信息。这本是为提供个性化服务&#xff0c;但对那些需要在不同平台同时管理多个账号…

11.数据库技术(下)

1.select语句 中括号表示可有可无&#xff1b; 尖括号表示变量名&#xff1b; 分组后再筛选&#xff0c;用having&#xff1b;分组前筛选&#xff0c;用where&#xff1b; select后跟随的所有列&#xff0c;除聚集函数外&#xff0c;都需要列在group by后&#xff1b; 注&…

【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻

导语&#xff1a; 比特币(Bitcoin)&#xff0c;这个充满神秘色彩的数字货币&#xff0c;自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻&#xff0c;都让人欲罢不能。今天&#xff0c;我们将深入挖掘比特币的每一个角落&…

HarmonyOS应用/元服务发布流程

在发布HarmonyOS应用/元服务前&#xff0c;建议您在本地进行调试&#xff0c;以查看和验证应用/元服务运行效果&#xff0c;减少发布过程中可能遇到的问题。 华为支持您使用HUAWEI DevEco Studio自动化签名的方式对应用/元服务进行调试&#xff0c;总体流程如下。 配置签名信息…

蓝桥杯练习系统(算法训练)ALGO-967 共线

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给定2维平面上n个整点的坐标&#xff0c;一条直线最多能过几个点&#xff1f; 输入格式 第一行一个整数n表示点的个数   …

c语言--跳出continue、break

C 语言中的 continue 语句有点像 break 语句。但它不是强制终止&#xff0c;continue 会跳过当前循环中的代码&#xff0c;强迫开始下一次循环。 对于 for 循环&#xff0c;continue 语句执行后自增语句仍然会执行。对于 while 和 do…while 循环&#xff0c;continue 语句重新…

CI860K01 3BSE032444R1 参数说明书

ABB CI860K01 3BSE032444R1是一款ABB公司生产的通信接口模块。 这款模块是专为工业自动化环境设计的&#xff0c;能够在各种设备之间提供稳定和可靠的数据传输接口。它采用了先进的通信技术和严格的生产工艺&#xff0c;确保了产品的高质量和性能。此外&#xff0c;它的设计合…

antdp | 菜单展示-菜单路由配置

扩展的路由配置 Layout 插件会基于 umi 的路由&#xff0c;封装了更多的配置项&#xff0c;支持更多配置式的能力。新增&#xff1a; 侧边栏菜单配置布局路由级别展示 / 隐藏相关配置与权限插件结合&#xff0c;配置式实现权限路由的功能 示例如下&#xff1a; //config/rou…

抗干扰段码屏驱动芯片/ LCD液晶屏驱动/仪器仪表液晶驱动IC-VK1C21D/DA FAE支持

产品型号&#xff1a;VK1C21D/DA 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP28/SSOP28 可定制裸片&#xff1a;DICE(COB邦定片)&#xff1b;COG(邦定玻璃用) 工程服务&#xff0c;技术支持&#xff01; 概述&#xff1a; VK1C21D/DA是一个点阵式存储映射…

PTA金字塔游戏

幼儿园里真热闹&#xff0c;老师带着孩子们做一个名叫金字塔的游戏&#xff0c;游戏规则如下&#xff1a; 首先&#xff0c;老师把孩子们按身高从高到矮排列&#xff0c;选出最高的做队长&#xff0c;当金字塔的塔顶&#xff0c;之后在其余小朋友里选出两个最高的&#xff0c;…

【基于HTML5的网页设计及应用】——当前日期

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

串口IAP介绍

一、STM32编程方式 &#xff08;1&#xff09;在线编程&#xff08;ICP&#xff0c;in circuit programming&#xff09; 系统存储器&#xff1a;留给ST写启动程序代码&#xff0c;启动程序代码通过串口1接口实现对闪存存储器的编程。 &#xff08;2&#xff09;在程序中编程…

Python接口自动化pytest框架安装

1、创建一个requirements.txt文件夹 2、输入内容&#xff1a;如下图 pytest pytest-html pytest-xdist pytest-ordering pytest-rerunfailures pytest-base-url allure-pytest3、在terminal中输入安装命令&#xff1a;pip install -r requirements.txt 安装成功 4、在termina…

飞书很好,但赢不了,只能裁员

心碎飞书 3 月 26 日&#xff0c;字节跳动旗下产品飞书的 CEO 谢欣发布全员信&#xff0c;正式宣布进行新一轮的组织调整&#xff0c;即裁员。 内部全员信如下&#xff1a; 我有不少朋友是在字节跳动&#xff0c;甚至就在 Lark 的。 同时我也因为会经常和一些平台的运营小伙伴有…

Kimi 200万字爆火,通义加码1000万,阿里笑而不语

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我怎么感觉Kimi是一个“网红”产品呢?在没有任何预兆情况下&#xff0c;国产AI大模型Kimi突然爆火&#xff0c;最近我在很多平台上看到了Kimi的广告&#xff0c;感觉到处都在吹这个产品。 看见上面的新闻了吧&a…

抓包工具charles修改请求和返回数据

数据篡改的主要使用场景&#xff1a; &#xff08;1&#xff09;mock场景&#xff0c;mock入参和返回值参数&#xff0c;实现mock测试 &#xff08;2&#xff09;安全测试&#xff0c;对于支付金额等比较重要的字段&#xff0c;可以修改请求参数来进行安全测试 1.首先选择要…

2024春招小红书前端面试题分享

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

DNS协议 是什么?说说DNS 完整的查询过程?

一、是什么 DNS&#xff08;Domain Names System&#xff09;&#xff0c;域名系统&#xff0c;是互联网一项服务&#xff0c;是进行域名和与之相对应的 IP 地址进行转换的服务器 简单来讲&#xff0c;DNS相当于一个翻译官&#xff0c;负责将域名翻译成ip地址 IP 地址&#…