社区讨论
样例WA 蒟蒻求调
P3372【模板】线段树 1参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjo5icc
- 此快照首次捕获于
- 2025/11/04 05:45 4 个月前
- 此快照最后确认于
- 2025/11/04 05:45 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
ll n,m,a[N];
struct Node{
ll l,r,sum,tag;
}tr[N<<2];
ll ls(ll u){return u<<1;}
ll rs(ll u){return u<<1|1;}
ll mid(ll l,ll r){return l+r>>1;}
void push_up(ll u){
tr[u].sum=tr[ls(u)].sum+tr[rs(u)].sum;
return ;
}
void push_down(ll u){
if(tr[u].tag!=0)
{
tr[ls(u)].tag+=tr[u].tag;
tr[rs(u)].tag+=tr[u].tag;
tr[ls(u)].sum+=tr[u].tag*(mid(tr[u].l,tr[u].r)-tr[ls(u)].l+1);
tr[rs(u)].sum+=tr[u].tag*(tr[rs(u)].r-mid(tr[u].l,tr[u].r));
tr[u].tag=0;
}
return ;
}
void build(ll u,ll l,ll r){
tr[u].l=l;tr[u].r=r;
if(l==r){
tr[u].sum=a[l];
return ;
}
build(ls(u),l,mid(l,r));
build(rs(u),mid(l,r)+1,r);
push_up(u);
}
void modify(ll u,ll l,ll r,ll k){
if(tr[u].r<=r&&tr[u].l>=l){
tr[u].sum+=k*(tr[u].r-tr[u].l+1);
tr[u].tag+=k;
return ;
}
push_down(u);
if(tr[ls(u)].r>=l)
modify(ls(u),l,r,k);
if(tr[rs(u)].l<=r)
modify(rs(u),l,r,k);
push_up(u);
}
ll query(ll u,ll l,ll r){
if(tr[u].l>=l&&tr[u].r<=r)
return tr[u].sum;
if(tr[u].r<=l||tr[u].l>r) return 0;
push_down(u);
ll ans=0;
if(tr[ls(u)].r>=l) ans+=query(ls(u),l,r);
if(tr[rs(u)].r>=l) ans+=query(rs(u),l,r);
return ans;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
int q,x,y,z;
scanf("%d",&q);
switch(q){
case 1:{
scanf("%lld%lld%lld",&x,&y,&z);
modify(1,x,y,z);
break;
}
case 2:{
scanf("%lld%lld",&x,&y);
cout<<query(1,x,y)<<endl;
break;
}
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...