社区讨论

线段树写挂,求条(样例没过)

P3372【模板】线段树 1参与者 2已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@m0hwmsep
此快照首次捕获于
2024/08/31 16:52
2 年前
此快照最后确认于
2025/11/05 00:27
4 个月前
查看原帖
C
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+1;
ll n,m,p,b,c,d,a[N],T[N<<2],tag[N<<2];
inline ll ls(ll x) {return x<<1;}
inline ll rs(ll x) {return x<<1|1;}
inline void push_up(ll x) {T[x]=T[ls(x)]+T[rs(x)];}
inline void push_down(ll l,ll r,ll x)
{
	ll m=(l+r)>>1;
	a[ls(x)]+=tag[x]*(m-l+1);
	tag[ls(x)]+=tag[x];
	a[rs(x)]+=tag[x]*(r-m);
	tag[rs(x)]+=tag[x];
	tag[x]=0;
}
void bulid(ll l,ll r,ll x)
{
	if(l==r)
	{
		T[x]=a[l];
		return;
	}
	ll m=(l+r)>>1;
	bulid(l,m,ls(x));
	bulid(m+1,r,rs(x));
	push_up(x);
}
void update(ll l,ll r,ll nl,ll nr,ll x,ll c)
{
	if(nl<=l&&r<=nr)
	{
		T[x]+=c*(r-l+1);
		tag[x]+=c;
		return;
	}
	push_down(l,r,x);
	m=(l+r)>>1;
	if(nl<=m)	update(l,m,nl,nr,ls(x),c);
	if(nr>m)	update(m+1,r,nl,nr,rs(x),c);
	push_up(x);
}
ll query(ll l,ll r,ll nl,ll nr,ll x)
{
	if(nl<=l&&r<=nr)	return T[x];
	push_down(l,r,x);
	ll m=(l+r)>>1,c=0;
	if(nl<=m)	c+=query(l,m,nl,nr,ls(x)); 
	if(nr>m)	c+=query(m+1,r,nl,nr,rs(x));
	return c; 
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	bulid(1,n,1);
	while(m--)
	{
		cin>>p;
		if(p==1)
		{
			cin>>b>>c>>d;
			update(1,n,b,c,1,d);
		}
		else
		{
			cin>>b>>c;
			cout<<query(1,n,b,c,1)<<endl;
		}
	}
	return 0;
}
玄关

回复

12 条回复,欢迎继续交流。

正在加载回复...