社区讨论

蒟蒻爆零求助qaq

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lobfcp0v
此快照首次捕获于
2023/10/29 20:05
2 年前
此快照最后确认于
2023/11/04 01:37
2 年前
查看原帖
rt
CPP
#include<bits/stdc++.h>
#define ll long long
//#include<conio.h>
//#include<windows.h>
using namespace std;
const int MAXN=1000005;
ll arr[MAXN],tree[MAXN<<2],tag[MAXN<<2];
inline ll ls(ll x)
{
	return x<<1;
}
inline ll rs(ll x)
{
	return x<<1|1;
}
inline void push_back(ll p)
{
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(ll l,ll r,ll p)
{
	if(l==r)
	{
		tree[p]=arr[l];
		return;	
	}
	ll mid=l+r>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	push_back(p);
}
inline void push__down(ll l,ll r,ll p,ll k)
{
	tag[p]+=k;
	tree[p]+=(r-l+1)*k;
}
inline void push_down(ll l,ll r,ll p)
{
	ll mid=l+r>>1;
	push__down(l,mid,ls(p),tag[p]);
	push__down(mid+1,r,rs(p),tag[p]);
	tag[p]=0;
}
inline void res(ll l_,ll r_,ll l,ll r,ll p,ll k)
{
	if(l_<=l&&r<=r_)
	{
		tree[p]+=(r-l+1)*k;
		tag[p]+=k;
		return;
	}
	ll mid=l+r>>1;
	push_down(l,r,p);
	if(l_<=mid)
		res(l_,r_,l,mid,ls(p),k);
	if(r_>mid)
		res(l_,r_,mid+1,r,rs(p),k);
	push_back(p);
}
ll que(ll l_,ll r_,ll l,ll r,ll p)
{
	if(l_<=l&&r<=r_)
		return tree[p];
	ll ans=0;
	ll mid=l+r>>1;
	push_down(l,r,p);
	if(l_<=mid)
		ans+=que(l_,r_,l,mid,ls(p));
	if(r_>mid)
		ans+=que(l_,r_,mid+1,r,rs(p));
	return ans;
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld",&arr[i]);
	build(1,1,n);
	while(m--)
	{
		int tmp;
		scanf("%d",&tmp);
		switch(tmp)
		{
			case 1:
				ll a,b,c;
				scanf("%lld%lld%lld",&a,&b,&c);
				res(a,b,1,n,1,c);
				break;
			default:
				ll a,b;
				scanf("%lld%lld",&a,&b);
				printf("%lld\n",que(a,b,1,n,1));
				break;
		}
	}
	return 0;
}

回复

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

正在加载回复...