社区讨论

95pts,WA#20,开了LL还不过,求调

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

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mditgi9a
此快照首次捕获于
2025/07/25 20:47
7 个月前
此快照最后确认于
2025/11/04 03:43
4 个月前
查看原帖
rt
CPP
#include<bits/stdc++.h>
#define ll unsigned long long
using namespace std;
struct node
{
	ll sum,l,r,mx,mi,lazy;
};
ll a[4000005];
node tree[4000005];
void push_down(ll rt)
{
	tree[rt*2].lazy+=tree[rt].lazy;
	tree[rt*2+1].lazy+=tree[rt].lazy;
	tree[rt*2].sum+=tree[rt].lazy*(tree[rt*2].r-tree[rt*2].l+1);
	tree[rt*2+1].sum+=tree[rt].lazy*(tree[rt*2+1].r-tree[rt*2+1].l+1);
	tree[rt].lazy=0;
}
void bl(ll rt,ll L,ll R)
{
	tree[rt].l=L;
	tree[rt].r=R;
	if(L==R)
	{
		tree[rt].sum=a[L];
		tree[rt].mx=a[L];
		return;
	}
	ll mid=(L+R)/2;
	bl(rt*2,L,mid);
	bl(rt*2+1,mid+1,R);
	tree[rt].sum=tree[rt*2].sum+tree[rt*2+1].sum;
	tree[rt].mx=max(tree[rt*2].mx,tree[rt*2+1].mx); 
}
ll query(ll rt,ll L,ll R)
{
	if(tree[rt].l>=L&&tree[rt].r<=R) return tree[rt].sum;
	push_down(rt);
	ll s=0;
	if(tree[rt*2].r>=L) s+=query(rt*2,L,R);
	if(tree[rt*2+1].l<=R) s+=query(rt*2+1,L,R);
	return s;
}
void modi(ll rt,ll x,ll y,ll k)
{
	if(tree[rt].l>=x&&tree[rt].r<=y)
	{
		tree[rt].sum+=k*(tree[rt].r-tree[rt].l+1);
		tree[rt].lazy+=k;
		return;
	}
	push_down(rt);
	if(tree[rt*2].r>=x) modi(rt*2,x,y,k);
	if(tree[rt*2+1].l<=y) modi(rt*2+1,x,y,k);
	tree[rt].sum=tree[rt*2].sum+tree[rt*2+1].sum;
}
int main()
{
	ll n,q;
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	bl(1,1,n);
	for(int i=1;i<=q;i++)
	{
		ll opt;
		scanf("%lld",&opt);
		if(opt==1)
		{
			int x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			modi(1,x,y,k);
		}
		else
		{
			int x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,x,y));
		}
	}
	return 0;
}
怎么也过不去qwq

回复

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

正在加载回复...