首页 > 其他分享 >线段树模板

线段树模板

时间:2024-05-22 15:21:44浏览次数:14  
标签:int 线段 rc query sum 模板

一、模板

#define lc(p) p << 1         // 左孩子 
#define rc(p) p << 1 | 1     // 右孩子 
const int MAX = 5e5 + 5;     // 数列元素最大个数 
ll n, m, w[MAX];             // n -- 数列元素个数; m -- 操作数; w[i] -- 第i个元素的值 
struct {int l, r; ll sum, tag;} tree[MAX << 2]; // 一般开元素个数的4倍数组 
// 边界为[l, r]; sum -- 区间和; tag -- 懒标记 

void pushup(int p)
{
	tree[p].sum = tree[lc(p)].sum + tree[rc(p)].sum; // 用区间p的左孩子和右孩子的值更新该区间的值 
}

void pushdown(int p)
{
	if (tree[p].tag) // 向下传递懒标记 
	{
		tree[lc(p)].sum += (tree[lc(p)].r - tree[lc(p)].l + 1) * tree[p].tag;
		tree[lc(p)].tag += tree[p].tag;
		
		tree[rc(p)].sum += (tree[rc(p)].r - tree[rc(p)].l + 1) * tree[p].tag;
		tree[rc(p)].tag += tree[p].tag;
		
		tree[p].tag = 0;
	}
}

void build(int p, int l, int r)
{
	tree[p] = {l, r, w[l], 0};
	if (l == r)    return;
	
	int m = l + r >> 1;          // 递归建立左、右子树 
	build(lc(p), l, m);
	build(rc(p), m + 1, r);
	
	pushup(p); 
}

void update(int p, int x, int y, int k)
{
	if (x <= tree[p].l && tree[p].r <= y)
	{
		tree[p].sum += (tree[p].r - tree[p].l + 1) * k;
		tree[p].tag += k;
		return;
	}
	
	pushdown(p);
	
	int m = tree[p].l + tree[p].r >> 1;
	if (x <= m)    update(lc(p), x, y, k);
	if (y > m)    update(rc(p), x, y, k);
	
	pushup(p);
}

ll query(int p, int x, int y)
{
	if (x <= tree[p].l && tree[p].r <= y)
		return tree[p].sum;
		
	pushdown(p);
	
	int m = tree[p].l + tree[p].r >> 1;
	ll sum = 0;
	if (x <= m)    sum += query(lc(p), x, y);
	if (y > m)    sum += query(rc(p), x, y);
	
	return sum;
}

二、相关例题

P3374 【模板】树状数组 1

P3372 【模板】线段树 1

标签:int,线段,rc,query,sum,模板
From: https://www.cnblogs.com/hoyd/p/18206308

相关文章

  • 基于LangChain的Prompt模板
    1.简述LangChainLangChain是一个开源库,它致力于让开发基于LLM的AI应用更简单,它是一个AI开发领域的万能适配器。它抽象化了与大语言模型(如OpenAI模型、文心模型等等)交互的复杂性,以及集成了周边的各种工具生态,让开发者可以专注于实现AI应用的逻辑和功能。LangChain提供了一系列易......
  • 线段树扩展
    首先是动态树,以数列操作为例点击查看代码#include<bits/stdc++.h>#definelsontr[id].l#definersontr[id].rusingnamespacestd;constintN=1e6+20;inta[N];structnode{ intl,r,sum;}tr[N<<2];intn,m;intnum;intrt;voidupdate(int&id,intl,intr,i......
  • thinkcmf 前台模板钩子 实现行为
    ThinkCMF中系统给前台模板内置很多钩子,但需要模板开发者在模板中正确位置增加相应钩子,插件才能在模板中正确使用。以下的所有钩子实现时都不用返回内容,都可以直接echo要显示的模板内容;示例比如我们要实现这个模板before_head_end行为:首先在event.php中新增 'BeforeHeadEnd'=>......
  • LCA[模板]
    #include<bits/stdc++.h>#defineintlonglong#defineMAXN500010usingnamespacestd;structedge{intnxt,to;};edgee[MAXN*2];inth[MAXN],ei;voidadd(intx,inty){ei++;e[ei].to=y;e[ei].nxt=h[x];h[x]=ei;}intu[......
  • C++常用模板
    常用模板:1.组合数(注意\(N\)与\(mod\))点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstllN=1e3+10,mod=998244353;lln,a[N],jc[N],dp[N],ans;voidinit(){ jc[0]=1; for(inti=1;i<N;i++)jc[i]=jc[i-1]*i%mod;}llksm......
  • hdu4027(线段树区间操作)
    Problem-4027(hdu.edu.cn)许多邪恶的战舰在战斗前排成一排。我们的指挥官决定使用我们的秘密武器来消灭战列舰。每艘战列舰都可以标记为耐力值。对于我们秘密武器的每一次攻击,它都可能降低连续部分战列舰的续航能力,使它们的续航力达到其原始续航力值的平方根。在我们的秘密武......
  • C123【模板】扩展域并查集 P1892 [BOI2003] 团伙
    视频链接:C123【模板】扩展域并查集P1892[BOI2003]团伙_哔哩哔哩_bilibili  P1892[BOI2003]团伙-洛谷|计算机科学教育新生态(luogu.com.cn)//扩展域并查集#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intn,m,a,b,......
  • 信息安全事件应急处理报告模板
    目录一、概述1.1应急处理服务背景1.2应急处理服务目的1.3应急处理服务范围1.4应急处理服务依据1.4.1应用处理服务委托协议1.4.2基础标准与法律文件1.4.3参考文件二、应急处理服务流程三、应急处理服务内容和方法3.1准备阶段3.1.1准备阶段工作流程3.1.2准备阶段处理过程3......
  • ide创建maven项目时,选择哪个模板
    创建新的java项目时,选择maven框架比较节省时间,因为部分文件和目录都会给你建好,免得自己再费力创建。  我们常用的三个框架为:1、cocoon-22-archetype-webapp 【如果创建带有页面的项目,可以选择这个】目录结构: 2、maven-archetype-quickstart  【......
  • mybatis底层模板模型是什么
    mybatis底层模板模型是建造者模式和模板方法模式的结合。建造者模式用于创建SqlSessionFactory和SqlSession对象。模板方法模式用于执行SQL语句和处理结果集。mybatis是对JDBC的再一次封装,不管怎么进行包装,还是会有获取连接、preparedStatement、封装参数、执行这些步骤......