线段树基础模板c++

news2025/1/23 7:25:45

在这里插入图片描述

在这里插入图片描述

线段树的基础模板代码

#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define int long long

#define lc p << 1     // 2*i
#define rc p << 1 | 1 // 2*i+1

int n, m;
int w[N];

struct node
{

  int l, r, sum, add;

} tr[N * 4];
// 构建线段树

void pushup(int p)
{
  tr[p].sum = tr[lc].sum + tr[rc].sum;
}
void pushdown(int p)
{
  if (tr[p].add)

  {
    tr[lc].sum += tr[p].add * (tr[lc].r - tr[lc].l + 1),
        tr[rc].sum += tr[p].add * (tr[rc].r - tr[rc].l + 1),
        tr[lc].add += tr[p].add,
        tr[rc].add += tr[p].add,
        tr[p].add = 0;
  }
}
void build(int p, int l, int r)
{
  tr[p] = {l, r, w[l], 0};
  if (l == r)
    return;
  int mid = l + r >> 1;
  build(lc, l, mid);
  build(rc, mid + 1, r);
  pushup(p);
}
int query(int p, int x, int y)
{ // 区查
  if (x <= tr[p].l && tr[p].r <= y)
    return tr[p].sum;
  int m = tr[p].l + tr[p].r >> 1;
  pushdown(p);
  int sum = 0;
  if (x <= m)
    sum += query(lc, x, y);
  //
  if (y > m)
    sum += query(rc, x, y);
  return sum;
}

void update(int p, int x, int y, int k)
{
  // 修改区间的值'
  if (x <= tr[p].l && tr[p].r <= y)
  {
    tr[p].sum += (tr[p].r - tr[p].l + 1) * k;
    tr[p].add += k;
    return;
  }
  int mid = tr[p].l + tr[p].r >> 1;
  pushdown(p); // 先下沉
  if (x <= mid)
  {
    update(lc, x, y, k);
  }
  if (y > mid)
  {
    update(rc, x, y, k);
  }
  pushup(p); // 再上乘
}

// 区间修改 对于区间[4,9] 内的每个数字
signed main()
{
  cin >> n >> m;

  for (int i = 1; i <= n; i++)
  {
    int x;
    cin >> x;
    w[i] = x;
  }
  build(1, 1, n);
  for (int i = 1; i <= m; i++)
  {
    int a, x, y, k;
    cin >> a >> x >> y;
    if (a == 1)
    {
      cin >> k;
      update(1, x, y, k);
    }
    else if (a == 2)
    {

      cout << query(1, x, y) << endl;
    }
  }
}

在这里插入图片描述

对点进行修改,从跟节点进入,找到根节点,将根节点的值修改下

在这里插入图片描述

查询区间
在这里插入图片描述

区间修改如果直接修改容易看出来时间复杂度是on的

懒惰修改在这里插入图片描述

修改上面区间的sum值,

https://ac.nowcoder.com/acm/contest/63746/A
题目,采用线段树的代码来解决问题

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 200005
#define lc p << 1
#define rc p << 1 | 1

int n, m;
struct node
{
  int l, r, sum, add;

} tr[N * 4];
int w[N];

void pushup(int p)
{
  tr[p].sum = tr[lc].sum + tr[rc].sum;
}
void pushdown(int p)
{
  if (tr[p].add)
    //^异或运算 
  {
    tr[lc].add ^= tr[p].add; //
    tr[rc].add ^= tr[p].add;

    tr[lc].sum = tr[lc].r - tr[lc].l + 1 - tr[lc].sum;
    tr[rc].sum = tr[rc].r - tr[rc].l + 1 - tr[rc].sum;
    tr[p].add = 0;
  }
}
void build(int p, int l, int r)
{
  tr[p] = {l, r};
  if (l == r)
  {
    tr[p].sum = w[l];
    return;
  }

  int mid = l + r >> 1;
  build(lc, l, mid);
  build(rc, mid + 1, r);
  pushup(p);
}

int query(int p, int x, int y)
{ // 区查
  // 如果以及完全覆盖掉
  if (x <= tr[p].l && tr[p].r <= y)
    return tr[p].sum;
  int m = tr[p].l + tr[p].r >> 1; // 没有完全覆盖就裂开
  pushdown(p);

  int sum = 0; // 定义局部变量 递归进入
  if (x <= m)
    sum += query(lc, x, y);
  //
  if (y > m)
    sum += query(rc, x, y);
  return sum;
}
// 查询时不变的 修改会发生变化

void update(int p, int x, int y)
{
  // 修改区间的值'
  if (x <= tr[p].l && tr[p].r <= y)
  {
    // 如果符合了
    // 区间修改
    tr[p].add ^= 1;//和1进行异或取反
    tr[p].sum = tr[p].r - tr[p].l + 1 - tr[p].sum;
    return;
  }

  int mid = tr[p].l + tr[p].r >> 1;
  pushdown(p); // 先下沉
  if (x <= mid)
  {
    update(lc, x, y);
  }
  if (y > mid)
  {
    update(rc, x, y);
  }
  pushup(p); // 再上乘
}

signed main()
{
  cin >> n >> m;
  string s;
  cin >> s;
  for (int i = 0; i < s.length(); i++)
  {
    w[i + 1] = s[i] - '0';
  }

  build(1, 1, n);

  for (int i = 1; i <= m; i++)
  {
    int a, x, y;
    cin >> a >> x >> y;
    if (a == 0)
    {

      update(1, x, y);
    }
    else if (a == 1)
    {

      cout << query(1, x, y) << endl;
    }
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

迅软DSE:为企业描绘安全蓝图,构建无忧网络办公天地

企业员工的不规范上网行为已成为管理人员面临的挑战&#xff0c;而利用上网行为管理软件则成为解决问题的最佳途径。 上网行为管理软件具备全面监控功能&#xff0c;可监控QQ、微信、电脑邮件、文件外发等行为&#xff0c;保证监控过程隐蔽而安全。通过实时屏幕监控功能&#…

智能优化算法应用:基于饥饿游戏算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于饥饿游戏算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于饥饿游戏算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.饥饿游戏算法4.实验参数设定5.算法结果6.参考…

【通信原理】数字基带信号传输和码间串扰

一、数字基带信号传输系统的组成二、无码间串扰的基带传输特性三、无码间串扰传输特性的设计

数据结构与算法编程题46

带权有向图邻接矩阵表示 //参考博客&#xff1a;https://blog.csdn.net/qq_54162207/article/details/117414707#include <iostream> using namespace std;#define Maxsize 100 #define VertexmMaxNum 20 #define ERROR 0 #define OK 1 typedef string VertexType; …

nginx遇到的问题和jks密码问题

1&#xff1a;nginx的配置&#xff1a; https 一定得配置 8080 ssl (我没有配置这个) 2&#xff1a;查看jks的密码 keytool -list -keystore secms.jks 让输入密码

【人体解剖学与组织胚胎学】练习二 重点知识点整理及对应习题

胃部 简答题 填空题 肝胆 简答题 填空题 消化道路径 简答题 牙位表示法 思考 [55, 85]都是乳牙&#xff0c;其它都是恒牙&#xff0c;考试中出现时&#xff0c;只需要画出十字&#xff0c;然后按上下对调&#xff0c;左右对调的角度进行观察

草柴返利APP领淘宝天猫优惠券拿购物返利 淘宝天猫订单如何隐藏删除订单记录?

草柴返利APP领淘宝天猫优惠券拿购物返利 手机安装「草柴」返利APP&#xff0c;复制要购买的商品链接到草柴&#xff0c;查询该商品淘宝天猫优惠券及购物返利&#xff0c;确认收货后到草柴返利APP提取返利&#xff1b; 淘宝天猫订单如何隐藏删除订单记录&#xff1f; 1、打开手…

【JavaEE进阶】 Spring 的创建和使⽤

文章目录 &#x1f334;前言&#x1f38b;创建 Spring 项⽬&#x1f6a9;创建⼀个 Maven 项⽬&#x1f6a9;添加 Spring 框架⽀持&#x1f6a9;添加启动类 &#x1f333;存储 Bean 对象&#x1f6a9;创建Bean&#x1f6a9;将 Bean 注册到容器 &#x1f332;获取并使⽤ Bean 对象…

Qt/C++音视频开发57-切换音视频轨道/切换节目流/分别切换音频视频轨道

一、前言 对各种音视频文件格式的支持&#xff0c;是一个播放器的基础功能。一般的音视频文件只有1路流&#xff0c;比如音频文件只有1路音频流&#xff0c;视频文件只有1路音频1路视频流&#xff0c;实践过程中发现&#xff0c;还有一种ts格式的文件&#xff0c;可能有多路流…

书-用数组给已知数组插入某个元素(3)

#include<stdio.h> int main(){int i ;int b[8]{99,65,87,23,44,55};//在87前面插入一个数int n6 ;// 长度for (in;i>3;i--)b[i]b[i-1]; //解释&#xff1a;原来23是第三个位置&#xff0c;但是插入数字后变成了第四个位置//就是把b[4]赋值给b[3];b[2]1000;nn1;//一定…

有向图的拓扑序列(拓扑排序)

给定一个 n 个点 m 条边的有向图&#xff0c;点的编号是 1 到 n&#xff0c;图中可能存在重边和自环。 请输出任意一个该有向图的拓扑序列&#xff0c;如果拓扑序列不存在&#xff0c;则输出 −1。 若一个由图中所有点构成的序列 A 满足&#xff1a;对于图中的每条边 (x,y)&a…

VSCode之C++ CUDA入门:reduce的N+1重境界

背景 Reduce是几乎所有多线程技术的基础和关键&#xff0c;同样也是诸如深度学习等领域的核心&#xff0c;简单如卷积运算&#xff0c;复杂如梯度聚合、分布式训练等&#xff0c;了解CUDA实现reduce&#xff0c;以及优化reduce是理解CUDA软硬件连接点的很好切入点。 硬件环境&…

wait notify

文章目录 1. API 介绍2. 怎么使用wait、notify2.1 sleep 和 wait 的区别2.2 sleep 和 wait 的使用模板 1. API 介绍 都属于 Object 对象的方法。必须获得此对象的锁&#xff0c;才能调用这几个方法&#xff0c;只有重量级锁才能调用wait、notify obj.wait() 让进入 object 监…

JMETER安装

jmeter 下载 https://jmeter.apache.org/download_jmeter.cgi 启动 jmeter.bat # GUI默认模式启动jmeterw.cmd # GUI默认启动(启动不带Windows shell窗口)jmeter-n.cmd # 放置一个JMX文件&#xff0c;命令行启动Jmeter测试jmeter-n-r.cmd # 放置一个JMX文件&#xff0c;命…

13、SQL注入——SQL盲注

文章目录 一、SQL盲注概述1.1 盲注1.2 盲注常用的函数 二、盲注payload2.1 布尔盲注2.2 时间盲注 一、SQL盲注概述 1.1 盲注 在SQL注入过程中&#xff0c;SQL语句执行后&#xff0c;选择的数据不能回显到前端页面&#xff0c;此时还需要利用一些方法进行判断或尝试&#xff0…

Linux常用指令详解

目录 前言&#xff1a; Linux的目录结构 Linux常用指令简介 whoami指令 ls指令 pwd指令 cd指令 tree指令 touch指令 mkdir指令 rmdir指令与rm指令 man指令 cp&#xff08;copy&#xff09;指令 mv&#xff08;move&#xff09;指令 cat指令 重定向及重定向的类型…

git常规操作流程(纯命令行操作)和一些注意事项

当你在单位拿到了git仓库,并利用公司给你的OA账号和邮箱完成了你的git基础配置,下面就是使用命令行的无错固定操作流程 如果你很着急,你可以直接跳到最后的总结部分 具体步骤 1.从仓库克隆代码到本地 这里的[codeUrl]就是你仓库的地址,当你在仓库点击图中绿色位置时,剪贴板…

深入了解UUID:生成、应用与优势

一、引言 在当今数字化时代&#xff0c;唯一标识一个对象的能力变得越来越重要。UUID&#xff08;Universally Unique Identifier&#xff0c;通用唯一标识符&#xff09;应运而生&#xff0c;作为一种保证全球唯一性的标识方法&#xff0c;广泛应用于各种场景。本文将详细介绍…

【头歌系统数据库实验】实验6 SQL的多表查询-2

目录 第1关&#xff1a;查询每个选手的信息及其提交的解答信息&#xff0c;没做题的选手不显示 第2关&#xff1a;查询做了1001题且耗时大于500&#xff08;time&#xff09;的选手信息 第3关&#xff1a;查询所有选手信息及其提交的解答信息&#xff0c;没做题的选手也要显…

计算机操作系统3

1.虚拟机 VM 两类虚拟机的对比&#xff1a; 2.进程 进程的特征&#xff1a; 进程状态的转换&#xff08;五大状态&#xff09; 3.进程控制原语的作用 4.线程 ​​​​​线程的属性 实现方式 5.调度算法的评价指标