【一个简单的整数问题2——线段树】

题目

代码

下面的两个代码的区别在于modify的分类,modify最简单的分类方式是存在性分类,另一种类似某些query采用的三段式分类,详细见代码

存在性

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5+10;
int a[N];
struct node
{
    int l, r;
    ll sum;
    ll add;
}tr[4*N];
void pushup(int u)
{
    tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void pushdown(int i)
{
    node &u = tr[i], &l = tr[i << 1], &r = tr[i << 1 | 1];
    if(u.add)
    {
        l.add += u.add; r.add += u.add;
        l.sum += (l.r - l.l + 1) * u.add; r.sum += (r.r - r.l + 1) * u.add;
        u.add = 0;
    }
}
void build(int u, int l, int r)
{
    if(l == r) tr[u] = {l, r, a[l], 0};
    else
    {
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid+1 , r);
        pushup(u);
    }
}
void modify(int u, int l, int r, int v)
{
    if(l <= tr[u].l && tr[u].r <= r)
    {
        tr[u].add += v;
        tr[u].sum += (ll)(tr[u].r - tr[u].l + 1) * v;
        return;
    }
    pushdown(u);
    int mid = tr[u].l + tr[u].r >> 1;
    if(l <= mid) modify(u << 1, l, r, v);
    if(r > mid) modify(u << 1 | 1, l, r, v);
    pushup(u);
}
ll query(int u, int l, int r)
{
    if(l <= tr[u].l && tr[u].r <= r) return tr[u].sum;
    pushdown(u);
    int mid = tr[u].l + tr[u].r >> 1;
    if(r <= mid) return query(u << 1, l, r);
    else if(l > mid) return query(u << 1 | 1, l, r);
    else
    {
        
        ll ans = 0;
        ans += query(u << 1, l, r);
        ans += query(u << 1 | 1, l, r);
        return ans;
    }
}
int main()
{
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];
    
    build(1, 1, n);
    while (m -- )
    {
        char op; int l, r;
        cin >> op >> l >> r;
        if(op == 'C')
        {
            int d;
            cin >> d;
            modify(1, l, r, d);
        }
        else
        {
            cout << query(1, l, r) << '\n';
        }
    }
    
    return 0;
}

三段式

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5+10;
int a[N];
struct node
{
    int l, r;
    ll sum;
    ll add;
}tr[4*N];
void pushup(int u)
{
    tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void pushdown(int i)
{
    node &u = tr[i], &l = tr[i << 1], &r = tr[i << 1 | 1];
    if(u.add)
    {
        l.add += u.add; r.add += u.add;
        l.sum += (l.r - l.l + 1) * u.add; r.sum += (r.r - r.l + 1) * u.add;
        u.add = 0;
    }
}
void build(int u, int l, int r)
{
    if(l == r) tr[u] = {l, r, a[l], 0};
    else
    {
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid+1 , r);
        pushup(u);
    }
}
void modify(int u, int l, int r, int v)
{
    if(l <= tr[u].l && tr[u].r <= r)
    {
        tr[u].add += v;
        tr[u].sum += (ll)(tr[u].r - tr[u].l + 1) * v;
        return;
    }
    pushdown(u);
    int mid = tr[u].l + tr[u].r >> 1;
    if(r <= mid) modify(u << 1, l, r, v);
    else if(l > mid) modify(u << 1 | 1, l, r, v);
    else
    {
        
        modify(u << 1, l, r, v);
        modify(u << 1 | 1, l, r, v);
    }
    pushup(u);
}
ll query(int u, int l, int r)
{
    if(l <= tr[u].l && tr[u].r <= r) return tr[u].sum;
    pushdown(u);
    int mid = tr[u].l + tr[u].r >> 1;
    if(r <= mid) return query(u << 1, l, r);
    else if(l > mid) return query(u << 1 | 1, l, r);
    else
    {
        
        ll ans = 0;
        ans += query(u << 1, l, r);
        ans += query(u << 1 | 1, l, r);
        return ans;
    }
}
int main()
{
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];
    
    build(1, 1, n);
    while (m -- )
    {
        char op; int l, r;
        cin >> op >> l >> r;
        if(op == 'C')
        {
            int d;
            cin >> d;
            modify(1, l, r, d);
        }
        else
        {
            cout << query(1, l, r) << '\n';
        }
    }
    
    return 0;
}

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

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

相关文章

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…

构建英语知识网站:Spring Boot框架解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Android mk/bp构建工具介绍

零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0c;加上网络上其实没有一个完整的介绍Bluedroid系列的文档&#xff0…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块B-1-Windows操作系统渗透测试

前言 本章节我将带领大家一起重新模拟操作一次Windows渗透测试模块&#xff0c;并加固的流程。 任务概览 环境部署 我的实验复现环境&#xff1a; 服务器Windows server 2008 R2 攻击机Kali Linux 场景操作系统Windows 7 额外还有台交换机支持&#xff1a; 这里我使用的是…

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代&#xff0c;小程序以其轻便、无需下载安装即可使用的特点&#xff0c;成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业&#xff0c;小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序&#xff0c;本文将为你提供一个从零开始的详细…

根据实验试要求,打通隧道连接服务器上的数据库,前端进行数据调用。

1.背景介绍 数据库布置在了工大实验试K80服务器上&#xff0c;本地属于外网无法直接访问校园内网。需要打通隧道&#xff0c;通过堡垒机进行服务器的访问。获取到数据库数据进行前端展示。 2.打通隧道 访问指令&#xff1a; 我选择使用Xshell打通隧道。优点&#xff1a;凭证…

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件 文章目录 使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件什么是 exe4j准备工作打包 Spring Boot 项目为 EXE 文件1.启动 exe4j2. 选择项目类型3. 配置项目名称和输出目录4. 配置项目类型或可执行文件名称5. java配…

24/11/26 视觉笔记 通过特征提取和透视变换查找对象

在本节中我们将检测和跟踪任意大小的对象&#xff0c;这些对象可能是在不同角度或者在部分遮挡的情况下观察到的。 为此我们将运用特征描述子&#xff08;Feature Descriptor&#xff09;&#xff0c;这是捕获感兴趣对象的重要属性的一种方式。我们这样是为了即使将对象嵌入繁…

【K8S问题系列 |18 】如何解决 imagePullSecrets配置正确,但docker pull仍然失败问题

如果 imagePullSecrets 配置正确&#xff0c;但在执行 docker pull 命令时仍然失败&#xff0c;可能存在以下几种原因。以下是详细的排查步骤和解决方案。 1. 检查 Docker 登录凭证 确保你使用的是与 imagePullSecrets 中相同的凭证进行 Docker 登录&#xff1a; 1.1 直接登录…

uniapp vue2项目迁移vue3项目

uniapp vue2项目迁移vue3项目&#xff0c;必须适配的部分 一、main.js 创建应用实例 // 之前 - Vue 2 import Vue from vue import App from ./App Vue.config.productionTip false // vue3 不再需要 App.mpType app // vue3 不再需要 const app new Vue({ ...App }) …

php反序列化1_常见php序列化的CTF考题

声明&#xff1a; 以下多内容来自暗月师傅我是通过他的教程来学习记录的&#xff0c;如有侵权联系删除。 一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客 一些其他大佬的wp参考&#xff1a;php_反序列化_1 | dayu’s blog (killdayu.com) 序列化一个对象将…

Web 表单开发全解析:从基础到高级掌握 HTML 表单设计

文章目录 前言一、什么是 Web 表单?二、表单元素详解总结前言 在现代 Web 开发中,表单 是用户与后端服务交互的重要桥梁。无论是用户登录、注册、搜索,还是提交反馈,表单都无处不在。在本文中,我们将从基础入手,全面解析表单的核心知识点,并通过示例带你轻松掌握表单开…

88页精品PPT | 某电信集团大数据平台建设方案技术交流

这份PPT文档是关于某电信集团大数据平台建设的技术交流方案&#xff0c;内容涵盖了现状分析、规划思路、产品设计、成功案例以及干货附录等多个部分。文档详细介绍了集团大数据平台的建设背景、技术特点、面临的挑战和痛点&#xff0c;以及具体的技术架构和实施策略。还包括了数…

利用图像识别给CAD图纸找不同

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【CSP CCF记录】201712-2第12次认证 游戏

题目 样例输入1 5 2 样例输出1 3 样例输入2 7 3 样例输出2 4 代码 没有技术含量的一道题 #include<bits/stdc.h> using namespace std; int main() {int n,k;int a[1010]{0}; // 标记小朋友是否被淘汰 cin>>n>>k;int i0,num0,mn; while(m!1){i1; if(a[i]!1…

Unity图形学之BRDF双向反射分布函数

1.描述了入射光线在非透明物体表面如何进行反射&#xff0c;也就是说多少光发生了漫反射&#xff0c;多少光发生了镜面反射 BRDF 函数计算的是“特定反射方向的光强与入射光强的比例” 2.各向异性 与 均向性 相反&#xff0c;是指在不同方向具有不同行为的性质&#xff0c;也就…

华为ENSP--BGP路由协议实验详解

项目背景 随着A公司网络规模的增长和新业务对互联网接入速度及稳定性需求的提升&#xff0c;公司决定升级其网络设施。为此&#xff0c;A公司向运营商B租用了两条线路以接入网络&#xff0c;旨在提高网络资源的利用率&#xff0c;并增强网络的安全性、稳定性和可靠性&#xff0…

Springboot项目搭建(5)-前端注册界面

1.创建项目文件 news&#xff1a;为后端IDE文件 news_client&#xff1a;为前端VSCode文件 在 ..\news\news_client 中启用cmd/PowerShell 查看当前 npm 配置的注册表&#xff08;registry&#xff09;地址是否在https://registry.npmmirror.com 如果不在&#xff0c;可在cd…

Centos 7 系统 openGauss 3.1.0 一主两备集群安装部署指南

现供职于某上市互联网公司担任DBA Oracle & PG ACE称号&#xff0c; 拥有 Oracle OCM、AWS、以及部分国产数据库等产品认证。 喜欢技术分享&#xff0c;热爱交友&#xff0c;也热爱健身。 2019年加入墨天轮&#xff0c;目前已发表了一百多篇原创文章&#xff0c;曾多次…