首页 > 其他分享 >P3372 【模板】线段树 1

P3372 【模板】线段树 1

时间:2024-09-29 16:36:09浏览次数:7  
标签:info sz typedef const int 线段 tag P3372 模板

注意size信息应该存放在info里和tag运算,已经tag是表示子树未处理的信息

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
const int N = 1e5+10;
int n,m;
int a[N];
struct info
{
	ll sum,sz;
};
struct tag
{
	ll add;
};
//处理左右子树
info operator + (const info &l,const info &r)
{
	return {l.sum + r.sum, l.sz + r.sz};
}
//处理节点和标记的作用
info operator + (const info &v,const tag &t)
{
	return {v.sum + t.add*v.sz, v.sz};
}
//处理lazy标记的传递t1作用于t2
tag operator + (const tag &t1, const tag &t2)
{
	return {t1.add + t2.add};
}
struct node
{
	int l,r;
	info val;
	tag t;
}tr[N<<2];

//settag是在pushdown里面用表示用tagt更新p点
void settag(int p,tag t)
{
	//注意tag表示的是下面的区段未更新的值,settag当前p应该由t更新
	tr[p].val = tr[p].val + t;
	tr[p].t = t + tr[p].t;
}
void pushup(int p)
{
	tr[p].val = tr[p<<1].val + tr[p<<1|1].val;
}
void pushdown(int p)
{
	auto &t = tr[p].t;
	if(t.add)
	{
		settag(p<<1,t);
		settag(p<<1|1,t);
		t.add = 0;
	}
}
void build(int l,int r,int p)
{
	tr[p].l = l, tr[p].r = r;
	if(l == r) 
	{
		tr[p].val = {a[r],1};
		return ;
	}
	int m = (l+r)/2;
	build(l,m,p<<1);
	build(m+1,r,p<<1|1);
	pushup(p);
}
void update(int L,int R,tag C,int p)
{
	int l = tr[p].l, r = tr[p].r;
	if(L<=l&&r<=R) 
	{
		settag(p,C);
		return ;
	}
	pushdown(p);
	int m = (l+r)/2;
	if(R<=m) update(L,R,C,p<<1);
	else if(L>m) update(L,R,C,p<<1|1);
	else 
	{
		update(L,m,C,p<<1);
		update(m+1,R,C,p<<1|1);
	}
	pushup(p);
}
info query(int L,int R,int p)
{
	int l = tr[p].l, r = tr[p].r;
	if(L<=l&&r<=R) return tr[p].val;
	pushdown(p);
	int m = (l+r)/2;
	if(R<=m) return query(L,R,p<<1);
	else if(L>m) return query(L,R,p<<1|1);
	else return query(L,m,p<<1) + query(m+1,R,p<<1|1);
}

void solve()
{
    cin>>n>>m;
	for(int i=1;i<=n;++i) cin>>a[i];
	build(1,n,1);
	for(int i=0;i<m;++i)
	{
		int op,l,r,x;
		cin>>op;
		if(op&1)
		{
			cin>>l>>r>>x;
			update(l,r,tag{x},1);
		}
		else
		{
			cin>>l>>r;
			cout<<query(l,r,1).sum<<'\n';
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	//cin>>T;
	while(T--)
	{
		solve();
	}
}

标签:info,sz,typedef,const,int,线段,tag,P3372,模板
From: https://www.cnblogs.com/ruoye123456/p/18440308

相关文章

  • P3368 【模板】树状数组 2
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • pbootcms模板上传栏目缩略图 变成1000像素的宽度
    在PbootCMS中,如果你上传的栏目缩略图宽度为1920像素,但在保存后自动变成了1000像素的宽度,可以通过调整配置文件中的相关设置来解决这个问题。解决方法打开配置文件:打开config/config.php文件。修改缩略图配置:将ico配置中的max_width和max_height修改为所需的尺寸。......
  • pbootcms模板如何做好防护
    为了提高PbootCMS模板的安全性,可以采取以下步骤进行防护:第一步:重命名数据文件夹将data文件夹的名字换成其他名称,例如mydata。mvdatamydata第二步:修改数据库配置文件打开config文件夹中的database.php文件。将文件中的data名称改为与第一步中相同的名称(例如mydat......
  • 检测到您模板中包含文件超过50个,请检查是否存在互相包含导致无限循环的情况!
    遇到PbootCMS模板中“检测到您模板中包含文件超过50个,请检查是否存在互相包含导致无限循环的情况!”的错误时,通常是因为模板文件之间存在互相包含的情况。具体来说,可能是某个模板文件中包含了自身或者形成了循环包含链。解决方案检查包含关系:仔细检查模板文件中的包含关系,找出可......
  • PbootCMS模板如何调用友情链接
    在PbootCMS中,使用友情链接标签可以方便地输出指定分组的友情链接。下面是一个详细的示例,展示了如何使用该标签以及如何控制输出的内容。友情链接标签示例1.基本用法{pboot:linknum=3gid=1}<ahref="[link:link]"target="_blank">[link:name]</a>|{/pboot:link}......
  • pbootcms模板内页如何调用相关文章
    在PBootCMS中,调用相关文章可以通过一些特定的标签和参数来实现。下面是一个具体的示例,展示如何在模板内页调用相关文章。示例代码假设您需要在一个内页中调用与当前文章相关的其他文章,可以使用以下代码:<!--调用相关文章--><divclass="related-articles"><h2>相关......
  • pbootcms模板如何输出当前页面的完整url地址
    在PBootCMS中,如果您需要在模板的某个位置调用当前页面的完整URL,可以使用 {pboot:httpurl} 和 {content:link} 标签来实现。这样可以方便地获取当前页面的完整URL并用于需要的地方。示例代码假设您需要在模板的某个位置调用当前页面的完整URL,可以使用以下代码:<!--......
  • PbootCMS模板安装与授权方法
    为了更清晰地展示PBootCMS模板的安装与授权步骤,可以将这些步骤整理成一个表格:步骤描述操作1准备环境将PBootCMS系统文件放入支持PHP(5.3+)的空间。<br>系统自带完整后台及模板,默认采用SQLite数据库,无需额外导入和配置。2访问后台访问后台地址:<br>http://ww......
  • 有效地提高 PBootCMS 模板的安全性
    第一步:重命名 data 文件夹重命名 data 文件夹:将 data 文件夹重命名为一个复杂的名称,例如 mubanbaba@data。第二步:修改 database.php 文件打开 config 文件夹:打开 config 文件夹,找到 database.php 文件。编辑 database.php 文件:使用HTML编辑......
  • Pbootcms模板源码如何做好防护
    为了提高PBootCMS模板的安全性,以下是一些详细的防护措施和步骤。这些措施可以有效减少网站被攻击的风险。防护措施升级后台到最新版本:确保PBootCMS后台已升级到最新版本,以获得最新的安全补丁和功能改进。重命名关键文件夹:更改关键文件夹名称,使其不易被猜测。......