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

线段树模板

时间:2024-02-22 19:33:20浏览次数:45  
标签:rt lc int 线段 mid rc sum 模板

向上回溯

void pushup(int rt){
	t[rt].sum += t[lc].sum + t[rc].sum;
	t[rt].mx = max(t[lc].mx, t[rc].mx);
} 

建树

void build(int rt, int l, int r){
	t[rt].l = l;
	t[rt].r = r;
	if(l == r){
		t[rt].mx = t[rt].sum = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(lc, l, mid);
	build(rc, mid+1, r);
	
	pushup(rt);
}

单点更新

void update(int rt, int pos, int w){
	if(t[rt].l == t[rt].r){
		t[rt].mx = t[rt].sum = w;
		return;
	}
	int mid = (t[rt].l + t[rt].r) >> 1;
	if(pos <= mid) update(lc, poe, w);
	else update(rc, pos, w);
	
	pushup(rt);
}

区间和查询

int query(int rt, int l, int r){
        if(l <= t[rt].l and t[rt].r <= r){
	    return t[rt].sum;
}
        int mid = (t[rt].l + t[rt].r) >> 1;
        int val = 0;
        if(l <= mid) val += query(lc, l, r);
        if(r > mid) val += query(rc, l, r);
	
        return val;
}

延迟标记

void pushdown(int rt){
	if(t[rt].lz){
		int la = t[rt].lz;
		t[rt].lz = 0;
		t[lc].lz += la;
		t[rc].lz += la;
		t[lc].sum += la * (t[lc].r - t[lc].l + 1);
		t[rc].sum += la * (t[rc].r - t[rc].l + 1);
	}
}

区间更新

void update(int rt, int l, int r, int w){
	if(l <= t[rt].l and t[rt].r <= r){
		t[rt].lz += w;
		t[rt].sum += w * (t[rt].r - t[rt].l + 1);
		return;
	}
	pushdown(rt);
	int mid = (t[rt].l + t[rt].r) >> 1;
	if(l <= mid) update(lc, l, r, w);
	if(r >= mid) update(rc, l, r, w);
	
	pushup(rt);
}

带延迟标记区间查询

int query(int rt, int l, int r){
	if(l <=  t[rt].l and t[rt].r <= r){
		return t[rt].sum;
	}
	pushdown(rt);
	int mid = (t[rt].l + t[rt].r) >> 1;
	int val = 0;
	if(l <= mid) val += query(lc, l, r);
	if(r > mid) val += query(rc, l, r);
	
	return val;
}

标签:rt,lc,int,线段,mid,rc,sum,模板
From: https://www.cnblogs.com/w1210323/p/18028003

相关文章

  • 洛谷题单指南-贪心-P1803 凌乱的yyy / 线段覆盖
    原题链接:https://www.luogu.com.cn/problem/P1803题意解读:通过某种贪心策略,使得能参加的比赛数越多越好。解题思路:将比赛按照结束时间由小到大哦排序,贪心策略是优先选择结束时间早的比赛,因为这样能保证后面参加更多其他比赛100分代码:#include<bits/stdc++.h>usingnamespa......
  • DFS算法模板(2488:A Knight's Journey)
    DFS算法(C++版本)题目一:链接:http://bailian.openjudge.cn/practice/2488/解析思路:骑士找路就是基本的DFS,用递归不断找到合适的路,找不到就回头直到找到合适的路。该题难点:要是实现字典序,也就是同样的两种选择,要走到A1而不是B1。所以就有了{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1......
  • 回溯算法模板 & 78子集代码
     voidbacktracking(参数){   if(终止条件){       存放结果;       return;   }   for(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){       处理节点;       backtracking(路径,选择列表);//递归       ......
  • 网络最大流(模板)
    不加弧优化#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=10005;intn,m,s,t;structedge{intv,nxt,val;}e[N*2];inthead[N],cnt=1;intdis[N];intmaxflow;voidadd(intu,intv,intval){ e[++cnt].val=va......
  • 山海经&&Atcoder Alternating String (线段树)
    前言:为什么把他们放在一起?因为我发现把pushup向上回溯放结构体类型函数里比较方便并且这两题确实也有相同思想山海经这题分三种情况左子树前缀和+右子树前缀和2.右子树后缀和与右总区间+左子树3.左区间最大子段与右区间最大子段与左后缀与右前缀特别要注意......
  • 清新简蓝响应式网站模板Traveler
    清新简蓝响应式网站模板Traveler适合做个人博客自媒体类站点,可以做技术类,分享心情类文章博客,界面简洁,实用,利seo排名优化。首页采用无限加载更多文章,效果很酷。traveler模板主题在更大的程度上照顾每个人的需求,菜单、首页每个栏目、侧栏小工具都可以自主开启关闭,只需在后......
  • 线段树学习笔记
    目录线段树的基础知识什么是线段树线段树的基本操作线段树的建树线段树的单点修改线段树的区间查询线段树的区间修改模板动态开点一些例题TheChildandSequence解法分析CodeLegacy相关知识:线段树优化建图解法分析Code线段树的基础知识什么是线段树线段树是一种分治思想的二叉......
  • 模板匹配里的一些数学原理
    模板匹配里的一些数学原理我们知道,在openCV里,模板匹配中匹配度的计算公式有三类。SQDIFF、CCORR、CCOEFF。下面我们来简单介绍一下这三类计算方法,并比较其不同之处。openCV里的模板匹配SQDIFFSQDIFF全称SumofSquaredDifference(SSD),即差的平方和。其离散形式为:\[E(\v......
  • vue3项目模板:新建一个vite+vue3项目,并做基础化建设
    原文地址:https://blog.csdn.net/weixin_43239880/article/details/130355138新建一个vite+vue3项目,并做基础化建设1.使用npmcreatvite@latest新建一个vue3项目2.生成git仓库3.将prettier的规则加入到eslint中(可选操作,建议有)4.添加commitLint(可选操作,建议有)5.加入UI组件库,以ele......
  • python 爬虫模板
    前言在我们写爬虫的时候,一般想要的数据都在详情页里面,一般代码进入详情页参数,需要首页里面寻找,所以爬这样的网站,需要定义一个模板我的模板如下: importrandomimporttimeimportrequestsfromauctionimportlogtoolfromauction.BaseCrawlerimportBaseCrawlercla......