首页 > 其他分享 >线段树-基础模版

线段树-基础模版

时间:2024-02-19 11:55:37浏览次数:17  
标签:ch return int 模版 线段 基础 sum id

线段树模版

一埋头扎进线段树一上午 感觉很神奇 几个函数就能把它完整的复现下来

这里有几张基础概念的图
image

image
对着代码来想 还是很好理解的

最后 是整理了能够处理总和 最大值和最小值的线段树模版

code:

$\LARGE\color{purple}{代码在这里}$
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int qr()
{
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return f*x;
}
#define qr qr()
const int Ratio=0;
const int N=2000005;
const int maxx=INT_MAX;
int n,m;
int a[N];

//线段树
struct stree
{
	int l,r;
	int dat,sum,miin;
}t[4*N];
void build(int id,int l,int r)//建树 
{
	t[id].l=l,t[id].r=r;
	if(l==r)
	{
		t[id].dat=a[l];
		t[id].sum=a[l];
		t[id].miin=a[l];
		return;
	}
	int m=(l+r)>>1;
	build(id*2,l,m);
	build(id*2+1,m+1,r);
	t[id].dat=max(t[id*2].dat,t[id*2+1].dat);
	t[id].sum=t[id*2].sum+t[id*2+1].sum;
	t[id].miin=min(t[id*2].miin,t[id*2+1].miin);
}
void changesum(int id,int x,int k)//求总和更新值 
{
	if(t[id].l==t[id].r)
	{
		t[id].sum+=k;
		return;
	}
	if(x<=t[id*2].r)
		changesum(id*2,x,k);
	else
		changesum(id*2+1,x,k);
	t[id].sum=t[id*2].sum+t[id*2+1].sum;
	return;
}
void changedat(int id,int x,int k)//求最大更新值
{
	if(t[id].l==t[id].r)
	{
		t[id].dat=k;
		return;
	}
	int m=(t[id].l+t[id].r)>>1;
	if(x<=m)
		changedat(id*2,x,k);
	else
		changedat(id*2+1,x,k);
	t[id].dat=max(t[id*2].dat,t[id*2+1].dat);
	return;
}
void changemin(int id,int x,int k)//求最小更新值 
{
	if(t[id].l==t[id].r)
	{
		t[id].miin=k;
		return;
	}
	int m=(t[id].l+t[id].r)>>1;
	if(x<=m)
		changemin(id*2,x,k);
	else
		changemin(id*2+1,x,k);
	t[id].miin=min(t[id*2].miin,t[id*2+1].miin);
	return;
} 
int srchsum(int id,int l,int r)//求总和 
{
	if(l<=t[id].l&&r>=t[id].r)
		return t[id].sum;
	if(t[id].r<l||t[id].l>r)
		return 0;
	int s=0;
	if(t[id*2].r>=l)
		s+=srchsum(id*2,l,r);
	if(t[id*2+1].l<=r)
		s+=srchsum(id*2+1,l,r);
	return s;
}
int srchdat(int id,int l,int r)//求最大值 
{
	if(l<=t[id].l&&r>=t[id].r)
		return t[id].dat;
	int v=-maxx;
	int mid=(t[id].l+t[id].r)>>1;
	if(l<=mid)
		v=max(v,srchdat(id*2,l,r));
	if(r>mid)
		v=max(v,srchdat(id*2+1,l,r));
	return v;
}
int srchmin(int id,int l,int r)//求最小值 
{
	if(l<=t[id].l&&r>=t[id].r)
		return t[id].miin;
	int v=maxx,mid=(t[id].l+t[id].r)>>1;
	if(l<=mid)
		v=min(v,srchmin(id*2,l,r));
	if(r>mid)
		v=min(v,srchmin(id*2+1,l,r));
	return v;
}
int main()
{
//	用不上自行删除QwQ 
	n=qr,m=qr;
	for(int i=1;i<=n;i++)
		a[i]=qr;
	for(int i=1;i<=m;i++)
	{
		int x=qr,y=qr;
//		printf("%d ",srchXXX(1,x,y));
	} 
	return Ratio;
}

希望能帮上你呢Qwq

标签:ch,return,int,模版,线段,基础,sum,id
From: https://www.cnblogs.com/DrRatio-DanhengYinyue1007/p/18020777

相关文章

  • 七下三角形精讲——三角形基础以及全等判定
    导言应某人在几个世纪前的要求,经过了一个寒假的研究(其实是到现在才想起来)这篇文章就讲一下三角形定义三角形很好理解,三个角组成的图形其实是三条直线首尾顺次相连组成的封闭图形分类按角分按角分的三角形可以分成锐角三角形、直角三角形、钝角三角形还有某些抽象的三角形......
  • python+selenium基础语法
    一、执行环境Python3.12.0selenium3.14.0二、八大元素定位//示例:打开百度,输入123,点击搜索fromseleniumimportwebdriverfromtimeimportsleepfromselenium.webdriver.common.byimportBydeftest():driver=webdriver.Chrome("D:/driver/chromedri......
  • 基础消息能力
    环境:.NetCore、Senparc.Weixin.MP被动回复用户消息需求:通过后台配置,不同业务平台的公众号被关注时回复不同的内容;配置关键字对应的回复内容;1///<summary>2///公众号消息回复3///</summary>4///<returns></returns>5publicasyncTask<string>WeCh......
  • Vim 安装与基础操作指南
    0x00链接Vim官网VimGitHubVim中文文档0x01准备(1)下载与安装在官网地址找到Download标签,在其中根据操作系统选择相应的版本,以下以Windows为例点击vim-win32-installersite至下载链接,根据系统位数下载相应的.exe或.zip文件32位——x8664位——x64安装路径......
  • JAVA基础-正则表达式
    1,正则表达式  正则表达式,又称规则表达式,(RegularExpression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用......
  • JAVA基础-类的成员
    1.类的成员-属性属性这里就是成员变量,也叫成员变量,直接定义在类中的。在方法体外声明的变量称之为成员变量实例变量(不以static修饰)类变量(以static修饰)在方法体内部声明的变量称之为局部变量形参(方法、构造器中定义的变量)方法局部变量(在方法体内定义)代码块变量(在代码......
  • JAVA基础-内存与垃圾回收
    1,运行时数据区1,程序计数器线程私有。生命周期:生命周期与线程同步。作用:它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。特点:它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域,唯一没有OutofMemory......
  • JAVA基础-IO
    1,IO概念IO通常表示计算机与外界数据的输入与输出。I/O流:IO流又叫输入输出流,输入和输出均是以内存作为参照物分类:1)按照流的方向以内存为参考物,往内存中去,叫做输入,从内存中出来,叫做输出。2)按照读取数据方式字节流,一次读取一个字节byte字符流,一次读取一个字符,具体几个......
  • JAVA基础-SPI
    1,什么是SPISPI全名ServiceProviderinterface,翻译过来就是“服务提供接口”,再说简单就是提供某一个服务的接口,提供给服务开发者或者服务生产商来进行实现。JavaSPI是JDK内置的一种动态加载扩展点的实现。这个机制在一般的业务代码中很少用到(个人接触到的业务没有用到过),但是......
  • JAVA基础-反射
    1,什么是反射?  Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类......