备战蓝桥杯---线段树基础2

今天我们把线段树的另一个模板看一下:

在这里,我们注意到乘的操作,因此我们用两个懒标记来分别表示加和乘,这时我们面临了一个问题,就是当我们把标记往下传时,它的儿子怎么知道是先乘还是先加?

究其原因,其实是括号在作祟,因此,我们每一次乘的时候,出了lazy*=num,我们把加法的标记也乘一下,这样子我们先乘后加,就巧妙地化解了括号的问题。

同时,还有一点我们需要注意,那就是当标记下移时,子节点的加法标记出了加上父节点的加法标记,还要*父节点的乘法标记。

举个例子,考虑原来的儿子为*2+3,父亲的懒标记也是*2+3,当我们下放时,应该变成*4+9,而其中的9就是由3+3*2得到的。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[10001],m,sum[4*10001];
int tree[4*10001];
int lazy1[4*10001];
int lazy2[4*10001];
void pushdown(int p,int l,int r);
int calc(int p,int l,int r,int x,int y,int k);
void build(int p,int l,int r){//建树 lazy2[p]=1;if(l==r){tree[p]=a[l]*a[l];sum[p]=a[l];return;}int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);tree[p]=tree[p*2+1]+tree[p*2];sum[p]=sum[p*2+1]+sum[p*2];return;
}
void pushdown(int p,int l,int r){//lazy标记下移 int mid=(l+r)/2;lazy1[p*2]=(lazy2[p])*lazy1[p*2]+lazy1[p];lazy1[p*2+1]=lazy1[p*2+1]*(lazy2[p])+lazy1[p];lazy2[p*2]*=lazy2[p];lazy2[p*2+1]*=lazy2[p];tree[p*2]=(lazy2[p])*(lazy2[p])*tree[p*2]+2*lazy1[p]*(lazy2[p])*sum[2*p]+lazy1[p]*lazy1[p]*(mid-l+1);//更新子节点的值 tree[p*2+1]=(lazy2[p])*(lazy2[p])*tree[p*2+1]+2*lazy1[p]*(lazy2[p])*sum[2*p+1]+lazy1[p]*lazy1[p]*(r-mid);sum[p*2]*=(lazy2[p]);sum[p*2+1]*=(lazy2[p]);sum[p*2]+=lazy1[p]*(mid-l+1);sum[p*2+1]+=lazy1[p]*(r-mid);lazy1[p]=0;//自己因为下移清0 lazy2[p]=1;
}
void change1(int p,int l,int r,int x,int y,int num){if(x<=l&&r<=y){tree[p]+=2*num*(sum[p])+num*num*(r-l+1);sum[p]+=num*(r-l+1);lazy1[p]+=num;return;}if(lazy1[p]!=0||lazy2[p]!=1){//区间部分修改,需要下移 pushdown(p,l,r);}int mid=(l+r)/2;if(y<=mid) change1(p*2,l,mid,x,y,num);if(x>mid) change1(p*2+1,mid+1,r,x,y,num);if(x<=mid&&y>mid){change1(p*2,l,mid,x,mid,num);change1(p*2+1,mid+1,r,mid+1,y,num);}tree[p]=tree[2*p]+tree[2*p+1];sum[p]=sum[2*p]+sum[2*p+1];return;
}
void change2(int p,int l,int r,int x,int y,int num){if(x<=l&&r<=y){tree[p]=num*num*tree[p];sum[p]*=num;lazy2[p]*=num;lazy1[p]*=num;return;}if(lazy1[p]!=0||lazy2[p]!=1){//区间部分修改,需要下移 pushdown(p,l,r);}int mid=(l+r)/2;if(y<=mid) change2(p*2,l,mid,x,y,num);if(x>mid) change2(p*2+1,mid+1,r,x,y,num);if(x<=mid&&y>mid){change2(p*2,l,mid,x,mid,num);change2(p*2+1,mid+1,r,mid+1,y,num);}tree[p]=tree[2*p]+tree[2*p+1];sum[p]=sum[2*p]+sum[2*p+1];return;
}
int calc(int p,int l,int r,int x,int y,int k){if(l>=x&&r<=y){if(k==1) return tree[p];else return sum[p];}if(lazy1[p]!=0||lazy2[p]!=1){pushdown(p,l,r);}int mid=(l+r)/2;if(y<=mid) return calc(p*2,l,mid,x,y,k);if(x>mid) return calc(p*2+1,mid+1,r,x,y,k);return calc(p*2,l,mid,x,mid,k)+calc(p*2+1,mid+1,r,mid+1,y,k);
}
signed main(){cin>>n>>m;for(int i=1;i<=n;i++) scanf("%lld",&a[i]);build(1,1,n);for(int i=1;i<=m;i++){int x,y,k,op;scanf("%lld%lld%lld",&op,&x,&y);if(op==1){printf("%lld\n",calc(1,1,n,x,y,0));}else if(op==2) printf("%lld\n",calc(1,1,n,x,y,1));else if(op==3){scanf("%lld",&k);change2(1,1,n,x,y,k);}else{scanf("%lld",&k);change1(1,1,n,x,y,k);}} 
} 

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

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

相关文章

2025张宇考研数学,百度网盘视频课+36讲PDF讲义+真题

张宇老师的课属于幽默生动&#xff0c;会让一个文科生爱上数学&#xff0c;但是有的同学不知道在哪看&#xff0c;可以看一下&#xff1a;2025张宇考研数学全程网盘 docs.qq.com/doc/DTmtOa0Fzc0V3WElI 可以粘贴在浏览器 张宇30讲作为一本基础讲义&#xff1a;和教材…

java的线程池介绍

什么是线程池&#xff1f; 线程池是一种用于管理和复用线程的机制&#xff0c;旨在减少线程的创建和销毁次数&#xff0c;提高线程的可重用性和执行效率。通过线程池&#xff0c;可以控制线程的数量、数量大小以及线程的执行方式&#xff0c;从而更加有效地处理并发任务。 线…

代码随想录刷题第48天

今天来看看股票市场。第一题是买卖股票的最佳时机https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/&#xff0c;首先想到了暴力解法&#xff0c;两层for循环&#xff0c;时间复杂度为n * n&#xff0c;代码超时了。 class Solution { public:int m…

如何使用公网地址远程访问内网Nacos UI界面查看注册服务

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Plik Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…

关于gossip协议

Gossip协议&#xff0c;也称为流言协议&#xff0c;是一种在分布式系统中用于节点之间通信和数据同步的算法。它的设计灵感来自于人类社交中的流言传播机制&#xff1a;一个人告诉几个人某个消息&#xff0c;这几个人再各自告诉其他几个人&#xff0c;如此反复&#xff0c;最终…

6、wuzhicms代码审计

wuzhicms代码审计 前言 安装环境配置 服务器要求 Web服务器: apache/nginx/iis PHP环境要求:支持php5.2、php5.3、php5.4、php5.5、php5.6、php7.1 (推荐使用5.4或更高版本!) 数据库要求: Mysql5www/install文件夹即可进入安装页面 审计开始 首页文件index.php&#xff0c…

使用Files工具类中的walkFileTree(Path, FileVisitor)方法对文件进行操作

使用Files工具类中的walkFileTree(Path, FileVisitor)方法&#xff0c;其中需要传入两个参数 Path&#xff1a;文件起始路径FileVisitor&#xff1a;文件访问器&#xff0c;使用访问者模式 接口的实现类SimpleFileVisitor有四个方法 preVisitDirectory&#xff1a;访问目录前的…

PHP curl 获取当前请求 header 信息

一、正常 curl 获取响应结果 1)、curl请求代码 $url http:://www.baidu.com; $data [param > test]; $ch curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array("content-type:application/json&qu…

kubernetes+prometheus+grafana监控+alertmanager实现qq邮箱报警

prometheus基于kubernetes监控 prometheus对kubernetes的监控 对于Kubernetes而言&#xff0c;我们可以把当中所有的资源分为几类&#xff1a; 基础设施层&#xff08;Node&#xff09;&#xff1a;集群节点&#xff0c;为整个集群和应用提供运行时资源容器基础设施&#xff…

C/C++内存管理及内存泄漏详解

目录 C/C内存分布 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 内置类型 自定义类型 内存泄漏 概念 内存泄漏分类 ⭐…

180基于matlab的频率切片小波变换程序(FTWT)

基于matlab的频率切片小波变换程序&#xff08;FTWT&#xff09;。从一种新的角度出发&#xff0c;通过自由选择频率切片函数、引进新尺度参数&#xff0c;在频率域实现小波变换&#xff0c;该变换能够很好地刻画信号各成分之间的相对能量关系。此外&#xff0c;频率切片小波变…

【InternLM 实战营笔记】OpenCompass大模型评测

随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型&#xff0c;开辟了自然语言模型生成式预训练的路线。沿着这条路线&#xff0c;随后又陆续发布了GPT-2和GPT-3模型。与此同时&#xff0c;谷歌也…

探讨苹果 Vision Pro 的 AI 数字人形象问题

Personas 的设计模糊性&#xff1a; 部分人认为这种模糊设计可能是出于安全考虑&#x1f6e1;️。安全角度&#xff1a;Personas 代表着你的 AI 数字形象&#xff0c;在创建时&#xff0c;它相当于你的 AVP&#xff08;生物识别扫描器的存在增加了冒充的难度&#xff09;。如果…

40、网络编程/TCP和UDP通信模型练习20240229

一、使用TCP模型创建服务器和客户端完成简单通信。 服务器代码&#xff1a; #include<myhead.h> #define SER_IP "192.168.32.130" #define SER_PORT 8888 int main(int argc, const char *argv[]) {//1.创建监听的套接字int sfd-1;sfdsocket(AF_INET,SOCK_S…

解决 MySQL 未运行但锁文件存在的问题

查看mysql状态时&#xff0c;显示错误信息"ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists"。 解决步骤 1、检查 MySQL 进程是否正在运行 在继续之前&#xff0c;我们首先需要确定 MySQL 进程是否正在运行。我们可以使用以下命令检查…

MBD开发专栏介绍

文章目录 MBD概念MBD工具箱介绍MBD专栏介绍MBD概念 MBD : Model-Based Design,基于模型的设计方法是一种系统开发方法论,即对系统进行建模、分析、验证,然后基于模型自动生成代码、测试用例和文档的设计开发过程MBD采用的是基于自然语言和图形语言的双重建模方式,让模型与用…

港中文联合MIT提出超长上下文LongLoRA大模型微调算法

论文名称&#xff1a; LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models 文章链接&#xff1a;https://arxiv.org/abs/2309.12307 代码仓库&#xff1a; https://github.com/dvlab-research/LongLoRA 现阶段&#xff0c;上下文窗口长度基本上成为了评估…

算法修炼-动态规划之路径问题(1)

62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;选定一个网格为终点&#xff0c;走到这个网格的所有走法就是这个网格的上面一个网格的所有走法加上这个网格左边一个网格的所有走法&#xff0c;然后做好初始化工作就行。 class Solution { public:int…

MATLAB环境下基于偏置场校正的改进模糊c-均值聚类图像分割算法

基于聚类的分割方法是以统计学为基础提出的一种分割方法。其实质是通过计算像素与每一类聚类中心的欧氏距离来判定像素与每一类聚类中心的相似性&#xff0c;距离近就说明像素与聚类中心相似性大&#xff0c;反之相似性小。基于一定标准下的相似性自动划分成若干个子集(类)&…

markdown笔记(自用)

一.标题语法#空格&#xff0c;几个#就是几级标题 四级标题<H> 二.段落语法 用空白行分开 你好 三.换行 在一行的末尾添加两个或多个空格&#xff0c;然后 v vvvvv 按回车键,即可创建一个换行()。 换行与段落的区别在于换行后两行是挨着的&#xff0c;而段落之间有一…