首页 > 其他分享 >线段树--RMQ

线段树--RMQ

时间:2024-05-04 18:22:26浏览次数:19  
标签:pr RMQ rs -- 线段 mid int tag pl

这是带上 lazy 标记的线段树板子

int a[N];

int ls(int p){return p << 1;}
int rs(int p){return p << 1|1;}

class SegmentTree{
public:
	int tree[N << 2|1], tag[N << 2 |1];
	inline void push_up(int p){
		tree[p] = tree[ls(p)] + tree[rs(p)];
	}
	inline void add(int p, int pl, int pr, int d){
		tree[p] += (pr - pl + 1)*d;
		tag[p] += d;
	}
	inline void build(int p, int pl, int pr){
		tag[p] = 0;
		if(pl == pr){
			tree[p] = a[pl];
			return ;
		}
		int mid = (pl + pr) >> 1;
		build(ls(p), pl, mid);
		build(rs(p), mid + 1, pr);
		push_up(p);
	}
	inline void push_down(int p, int pl, int pr){
		if(tag[p]){
			int mid = (pl + pr) >> 1;
			add(ls(p), pl, mid, tag[p]);
			add(rs(p), mid + 1, pr, tag[p]);
			tag[p] = 0;
		}
	}
	inline void update(int L, int R, int p, int pl, int pr, int d){
		if(L <= pl && pr <= R){
			add(p, pl, pr, d);
			return ;
		}
		push_down(p, pl, pr);
		int mid = (pl + pr) >> 1;
		if(L <= mid){
			update(L, R, ls(p), pl, mid, d);
		}
		if(R >= mid + 1){
			update(L, R, rs(p), mid + 1, pr, d);
		}
		push_up(p);
	}
	inline int query(int L, int R, int p, int pl, int pr){
		if(L <= pl && pr <= R){
			return tree[p];
		}
		int mid = (pl + pr) >> 1;
		push_down(p, pl, pr);
		int res = 0;
		if(L <= mid){
			res += query(L, R, ls(p), pl, mid);
		}
		if(R >= mid + 1){
			res += query(L, R, rs(p), mid + 1, pr);
		}
		return res;
	}
};
SegmentTree seg;

标签:pr,RMQ,rs,--,线段,mid,int,tag,pl
From: https://www.cnblogs.com/9102qyy/p/18172541

相关文章

  • 竞赛与剑术
    我是一名信息竞赛生,或许学会得不够多,但是我仍会继续学习。以下是我对竞赛的感触,随手一记:竞赛对我来说意味着什么?在我没搞竞赛的时候,我闲,自己探索我好奇的,自学了剑术。曾经有一段时间我学习压力很大,就在傍晚的时候练习剑术,打得一身薄汗。那是我对剑术是珍爱的。但是时与日去,学业......
  • 整体二分学习笔记
    1.简介在一些题目中,可能存在一些题目,对于每次询问直接二分可能会TLE,此时就要用到整体二分整体二分是一种离线的方法,适用于如下情况:询问答案具有可二分性修改对判定答案的贡献相互独立,修改之间互不影响效果修改如果对判定答案有贡献,则该贡献是一个确定的与判定标准无关......
  • 深入学习和理解Django视图层:处理请求与响应
    title:深入学习和理解Django视图层:处理请求与响应date:2024/5/417:47:55updated:2024/5/417:47:55categories:后端开发tags:Django请求处理响应生成模板渲染表单处理中间件异常处理第一章:Django框架概述1.1什么是Django?Django是一个高级的PythonWeb......
  • 常见的排序算法
    常见的排序算法目录一、冒泡排序(BubbleSort)二、插入排序(InsertSort)三、选择排序(SelectionSort)四、希尔排序(ShellSort)五、快速排序(QuickSort)六、堆排序(HeapSort)七、归并排序(MergeSort)八、计数排序(CountSort()九、桶排序(BucketSort)十、基数排序(RadixSor......
  • 【M5Stack物联网开发】第一章 物联网
    第一章物联网介绍不知道对于下面这段描述,你是否熟悉: 小明是一名对科技充满热情的年轻人,每天的生活都离不开智能设备的协助。清晨,智能手环轻轻震动将他唤醒,这款手环不仅能追踪他的睡眠质量,还能根据他的生活习惯自动调整闹钟时间。小明从床上起来后,便对着智能音箱询问今天的天......
  • K8S 创建Spring-boot项目并进行项目启动与访问
     ##Spring-boot 的helloworld项目packagecom.example.demo;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMappi......
  • kiCad新建符号库(系统自带封装库)
    软件版本:KiCad8.01打开软件,选择工程,并打开原理图:2点击符号编辑器:3新建符号搜索XL,在Regulator_Switching(稳压器开关)一栏中已有一部分XL系列的稳压芯片:在此基础上新建一个XL7056的降压型DC-DC转换器,右键,选择新建符号:输入新建的符号名:此时,在Regulator_Switching(稳......
  • 题解【[ABC155F] Perils in Parallel】(未完成)
    题目链接两个常规转化:灯的坐标与区间坐标都很大,不妨将其离散化,转化为\(1\simn\)的点与\(1\simn\)的操作区间。对于一段区间取反,可以理解为对一段区间异或\(1\),转化为在异或差分数组上操作,即差分数组\(diff_i=a_i\bigoplusa_{i-1}\),区间\([l,r]\)异或\(1\)转化为差......
  • 【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台
    1.项目介绍  基于.NETFramework4.8开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等应用场景,同时支持图像与视频检测。模型部署引擎使用的是OpenVINO™、TensorRT、ONNXruntime以及OpenCVDNN,支持CP......
  • 视图查询优化-不带条件
    视图查询优化-不带条件sqlselect/*+VIEW_FILTER_MERGING(1)NO_USE_CVT_VAR*/v.account_number,v.bill_id,v.account_id,v.bill_line_id,v.bill_number,v.business_type,v.business_type_sub,v.EVENT_ID,v......