社区讨论
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 条回复,欢迎继续交流。
正在加载回复...