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

线段树模板

时间:2024-04-06 10:23:27浏览次数:13  
标签:pr 线段 mid addtag tag 模板 ll pl

#include<iostream>
#include<map>
#include<algorithm>
#include<math.h>

using namespace std;
/*3372*/
typedef long long ll;
const int N = 1e5 + 10;
ll a[N] = { 0 };
ll tree[N << 2] = { 0 };
ll tag[N << 2] = { 0 };
ll ls(ll p) { return p << 1; }
ll rs(ll p) { return p << 1 | 1; }
void push_up(ll p)//更新节点,这里的p指的是线段树静态数组中的索引,也就是树的树叶
{
	tree[p] = tree[ls(p)] + tree[rs(p)];
}
void build(ll p, ll pl, ll pr)
//给出的是建树,需要p,p的左节点pl,p的右节点pr,一般调用是直接build(1,1,n),从第一个节点开始
{
    tag[p] = 0;//lazytag标记修改
	if (pl == pr) { tree[p] = a[pl]; return; }
	ll mid = (pl + pr) >> 1;
	build(ls(p), pl, mid);//左子树建立
	build(rs(p), mid + 1, pr);//右子树建立
	push_up(p);//p节点更新
}
void addtag(ll p, ll pl, ll pr, ll d)//更新:打上标签,作用:在某个区间被完全覆盖的时候可以使用addtag
{
	tag[p] += d;
	tree[p] += d * (pr - pl + 1);
}
void push_down(ll p, ll pl, ll pr)//不能覆盖的时候,把“addtag”中生成的标签tag传递给左右子树
{
	if (tag[p])//如果tag[p]不为0,就是被addtag打上标记的时候
	{
		ll mid = (pl + pr) >> 1;//一样,利用addtag传递
		addtag(ls(p), pl, mid, tag[p]);
		addtag(rs(p), mid + 1, pr, tag[p]);
		tag[p] = 0;
	}
}
void update(ll L, ll R, ll p, ll pl, ll pr, ll d)
{
	//L,R里的每个元素+d
	if (L <= pl and pr <= R) { addtag(p, pl, pr, d); return; }//当完全覆盖,直接返回并打上标记
	push_down(p, pl, pr);//如果没有return掉,说明就需要分隔
	ll mid = (pl + pr) >> 1;
	if (L <= mid)update(L, R, ls(p), pl, mid, d);//左子树
	if (R > mid)update(L, R, rs(p), mid + 1, pr, d);//右子树
	push_up(p);
}
ll query(ll L, ll R, ll p, ll pl, ll pr)
{
	//查询区间L,R,p是当前节点(线段)的编号,pl,pr是节点p的线段区间
	if (pl >= L and pr <= R)return tree[p];//完全覆盖,以顶点代区间
	push_down(p, pl, pr);//不能就先用push_down处理tag
	ll res = 0;
	ll mid = (pl + pr) >> 1;
	if (L <=mid)res += query(L, R, ls(p), pl, mid);
	if (R > mid)res += query(L, R, rs(p), mid + 1, pr);
	return res;
}
int main()
{
	ll n, m; cin >> n >> m;
	for (ll i = 1; i <= n; i++)cin >> a[i];
	build(1, 1, n);
	while (m--)
	{
		ll q, L, R, d;
		cin >> q;
		if (q == 1)
		{
			cin >> L >> R >> d;
			update(L, R, 1, 1, n, d);
		}
		else
		{
			cin >> L >> R;
			cout << query(L, R, 1, 1, n)<<endl;
		}
	}
}

标签:pr,线段,mid,addtag,tag,模板,ll,pl
From: https://www.cnblogs.com/zzzsacmblog/p/18117193

相关文章

  • #离线,线段树#SP1557 GSS2 - Can you answer these queries II
    题目给定大小为\(n\)的序列,\(q\)次询问,求最大子段和,相同的数只算一次。选出的子段可以为空。分析数字不重复很难做,考虑离线,询问区间按右端点排序枚举区间右端点,不重复就相当于给\([pre+1,i]\)为开头的区间后添加\(a_i\)那么相当于维护以\(j\)为开头的最大子段和,以......
  • #线段树,模拟费用流#CF280D k-Maximum Subsequence Sum
    题目给定一个大小为\(n\)的序列,要求支持单点修改和查询区间内至多\(k\)个不交子区间之和的最大值(可以不取)分析考虑源点向每个点、每个点向汇点流流量1费用0的边,每个点向右边的点流流量1费用\(a_i\)的边,流量最大为\(k\),这样构建出一个费用流的模型。很显然,退流相当于给区......
  • P1439 【模板】最长公共子序列
    题面:回顾下最长公共子序列:if(a[i]!=b[j])dp[i][j]=max(dp[i-1][j],dp[i][j-1]);elsedp[i][j]=dp[i-1][j-1]+1;复杂度为O(n^2)但是这题不行,数据卡到了1e5,所以应该再次观察:注意到是两个全排列,那么利用map,把第一个序列当作基准列,做等效替换:把原来的值替换成1,2,3.........
  • 最长上升子序列LIS模板
    参考链接:https://blog.csdn.net/lxt_Lucia/article/details/81206439#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>......
  • C111【模板】莫队算法 P2709 小B的询问
    视频链接:C111【模板】莫队算法P2709小B的询问_哔哩哔哩_bilibili   LuoguP2709小B的询问//普通莫队O(n*sqrt(n))#include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=50005;intn,m,k,B,a[N];......
  • 帝国CMS模板源码整站安装说明
    安装步骤第一步:先把得到的文件解压缩,把文件通过FTP传到空间里。(请不要把类似ecms014.cncobo.com这个文件夹传到FTP,请传这个大文件夹下面的所有文件夹和文件到空间根目录,请不要上传到2级目录,除非你自己会改模板CSS和JS调用相对地址!)第二步:浏览器键入你的域名或者IP/e/install/inde......
  • django渲染模板与vue的语法冲突解决Flask框架默认WSGI:Werkzeug
    django渲染模板与vue的语法冲突解决Flask框架默认WSGI:Werkzeug Python来说,它有很多web框架,常见的有jango、Flask、Tornado、sanic等,比如Odoo、Superset都基于Flask框架进行开发的开源平台,具有强大的功能。在Linux下,默认使用的WSGIServer一般为Gunicorn,它是一个比较出名的We......
  • P5960 【模板】差分约束
    原题链接题解我一直苦苦思考为什么要建边,现在我明白了,如果令\(x_i\)代表离源点的最短路径长度的话,建边之后,\(x_i-x_j<=y_k\)一定成立只有当出现负环的时候说明条件出现了矛盾太神了code#include<bits/stdc++.h>usingnamespacestd;queue<int>q;intin_q[5005]={0};......
  • nodejs中使用Nunjucks 模板引擎
    要在Koa2中使用Nunjucks模板引擎,你需要进行一些额外的设置。以下是一个示例代码,演示了如何在Koa2中集成Nunjucks:首先,确保已经安装了Koa和Nunjucks:npminstallkoanunjucks然后,在项目中创建一个名为app.js的文件,并添加以下代码:constKoa=require('koa');con......
  • 【Java】PDF模板生成PDF文档
    一、需求背景客户要求一份文书,文书内容有一些表单项,例如:1、基本的是和否(单选框或复选框)2、备注内容(纯文本信息)3、单位,机构组织,人员,字典项(下拉选择)4、用户数字签名(图片信息)文书的模板是固定不变的,只需要把上述信息写入模板中生成即可这个模板不是动态的,动态模板是表单数据......