线段树基础模板c++

在这里插入图片描述

在这里插入图片描述

线段树的基础模板代码

#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+1int 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 | 1int 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.rhkb.cn/news/211580.html

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

相关文章

【Openstack Train安装】四、MariaDB/RabbitMQ 安装

本章介绍了MariaDB/RabbitMQ的安装步骤&#xff0c;MariaDB/RabbitMQ仅需要在控制节点安装。 在安装MariaDB/RabbitMQ前&#xff0c;请确保您按照以下教程进行了相关配置&#xff1a; 【Openstack Train安装】一、虚拟机创建 【Openstack Train安装】二、NTP安装 【Opensta…

分支和循环

通常来说&#xff0c;C语言是结构化的程序设计语言&#xff0c;这里的结构包括顺序结构、选择结构、循环结构&#xff0c;C语言能够实现这三种结构&#xff0c;如果我们仔细分析&#xff0c;我们日常生活中所见的事情都可以拆分为这三种结构或者它们的组合。 下面我会仔细讲解我…

Windows驱动中使用数字签名验证控制设备访问权限

1. 背景 在一般的驱动开发时&#xff0c;创建了符号链接后在应用层就可以访问打开我们的设备并进行通讯。 但我们有时候不希望非自己的进程访问我们的设备并进行交互&#xff0c;虽然可以使用 IoCreateDeviceSecure 来创建有安全描述符的设备&#xff0c;但大数的用户账户为了方…

基于Vue.js的厦门旅游电子商务预订系统的设计和实现

项目编号&#xff1a; S 030 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S030&#xff0c;文末获取源码。} 项目编号&#xff1a;S030&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒…

【Redis】redis 高性能--线程模型以及epoll网络框架

目录 一.前言 二.多线程的弊端 2.1 锁的开销问题 2.2 多线程上下文切换带来的额外开销 2.3 多线程占用内存成本增高 三.基本IO模型与epoll 模式 3.1 基本IO模型 3.2 单线程处理机制 四.总结 一.前言 我们经常讨论到&#xff0c;redis 是单线程&#xff0c;那为什么单线…

02、pytest环境准备

工具准备 下载Python——python官网下载&#xff1a;https://www.python.org/下载PyCharm——pycharm官网下载&#xff1a;https://www.jetbrains.com.cn/en-us/pycharm/参考文档——pytest官方文档&#xff1a;https://docs.pytest.org/en/7.4.x/一个方便好用的office库——p…

632. 最小区间

632. 最小区间 class Solution {public int[] smallestRange(List<List<Integer>> nums) {int size nums.size();Map<Integer, List<Integer>> indices new HashMap<Integer, List<Integer>>();int xMin Integer.MAX_VALUE, xMax Inte…

在线 SQL 模拟器SQL Fiddle使用简介

在线 SQL 模拟器SQL Fiddle使用简介 本文可作为“SQL语言与SQL在线实验工具的使用” https://blog.csdn.net/cnds123/article/details/115038700 一文的补充。 有时候&#xff0c;我们想去验证 SQL语句&#xff0c;却缺少数据库环境&#xff0c;那该怎么办呢&#xff1f; 这…

Flask使用线程异步执行耗时任务

1 问题说明 1.1 任务简述 在开发Flask应用中一定会遇到执行耗时任务&#xff0c;但是Flask是轻量级的同步框架&#xff0c;即在单个请求时服务会阻被塞&#xff0c;直到任务完成&#xff08;注意&#xff1a;当前请求被阻塞不会影响到其他请求&#xff09;。 解决异步问题有…

人工智能原理复习--知识表示(二)

文章目录 上一篇产生式表示法推理方式 结构化表示语义网络语义网络表示知识的方法和步骤应用题目 框架表示法下一篇 上一篇 人工智能原理复习–知识表示&#xff08;一&#xff09; 产生式表示法 把推理和行为的过程用产生式规则表示&#xff0c;所以又称基于规则的系统。 产…

NDIS协议驱动开发指南

文章目录 NDIS协议驱动开发指南1. 技术概览2. NDIS协议驱动2.1 BindAdapterHandlerEx2.2 SendNetBufferListsCompleteHandler2.3 ReceiveNetBufferListsHandler2.4 ProtocolNetPnpEvent 3. NET_BUFFER_LIST4. ndisprot实例5. 总结 NDIS协议驱动开发指南 我们知道&#xff0c;在…

【DPDK】Trace Library

概述 跟踪是一种用于了解运行中的软件系统中发生了什么的技术。用于跟踪的软件被称为跟踪器&#xff0c;在概念上类似于磁带记录器。记录时&#xff0c;放置在软件源代码中的特定检测点会生成保存在巨大磁带上的事件&#xff1a;跟踪文件。稍后可以在跟踪查看器中打开跟踪文件…

SpringSecurity的默认登录页的使用

SpringSecurity的默认登录页的使用 01 前期准备 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysql驱动--><dependency><grou…

【S32K3环境搭建】-0.3-S32DS安装实时驱动RTD(Real-Time Driver)

目录 1 什么是“实时驱动RTD(Real-Time Driver)” 2 安装“实时驱动RTD(Real-Time Driver)” 2.1 方法一&#xff1a;通过S32DS Extensions and Updates安装“实时驱动RTD(Real-Time Driver)” 2.2 方法二&#xff1a;通过Install New Software…安装“实时驱动RTD(Real-Ti…

【海思SS528 | VO】MPP媒体处理软件V5.0 | 视频输出模块——学习笔记

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Docker本地部署Firefox火狐浏览器并远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

zookeeper集群 +kafka集群

1.zookeeper kafka3.0之前依赖于zookeeper zookeeper是一个开源&#xff0c;分布式的架构&#xff0c;提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式涉及的分布式服务管理架构 存储和管理数据&#xff0c;分布式节点上的服务接受观察者的注册&#xff0c…

ATFX汇市:加央行即将公布12月利率决议结果,大概率维持5%不变

ATFX汇市&#xff1a;2023年美联储的8次利率决议计划&#xff0c;已经公布7次结果&#xff0c;其中有四次加息&#xff0c;三次暂停加息&#xff0c;并且近两次的决议结果都是不加息。美联储的货币政策对其他国家中央银行的决策具有指导作用&#xff0c;尤其是经济数据与美国共…

Android的前台服务

概述 前台服务是用户主动意识到的一种服务&#xff0c;因此在内存不足时&#xff0c;系统也不会考虑将其终止。前台服务必须为状态栏提供通知&#xff0c;将其放在运行中的标题下方。这意味着除非将服务停止或从前台移除&#xff0c;否则不能清除该通知。 在 Android 8.0&…

CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏

Problem P24. [算法课贪心] 跳跃游戏 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标。 输入 输入一行数组nums 输出 输出true/fasle 样例 标准输入 2 3 1 …