社区讨论

线段树1求条

灌水区参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@m5tbrb9u
此快照首次捕获于
2025/01/12 15:59
去年
此快照最后确认于
2025/11/04 11:43
4 个月前
查看原帖
C
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+7;
ll n,root=1,q;
struct Node{
  ll l,r,v,t;
} tr[N<<2];
ll a[N];
ll pushup(ll u){
  tr[u].v=tr[u<<1].v+tr[u<<1|1].v;
  return 0;
}
ll build(ll u,ll l,ll r){
  tr[u].l=l;
  tr[u].r=r;
  if(l==r){
    tr[u].v=a[l];
    return 0;
  }
  ll mid=l+r>>1;
  build(u<<1,l,mid);
  build(u<<1|1,mid+1,r);
  pushup(u);
  return 0;
}
ll calc(ll u,ll d){
  tr[u].v+=(tr[u].r-tr[u].l+1)*d;
  tr[u].t+=d;
}
ll pushdown(ll u){
	calc(u<<1,tr[u].t);
	calc(u<<1|1,tr[u].t);
	tr[u].t=0;
}
ll modify(ll u,ll l,ll r,ll v){
  if(l<=tr[u].l&&tr[u].r<=r){
    calc(u,v);
    return 0;
  }
  ll mid=tr[u].l+tr[u].r>>1;
  pushdown(u);
  if(l<=mid){
    modify(u<<1,l,r,v);
  }
  if(r>=mid+1){
    modify(u<<1|1,l,r,v);
  }
  pushup(u);
  return 0;
}
ll query(ll u,ll l,ll r){
  if(l<=tr[u].l&&tr[u].r<=r){
    return tr[u].v;
  }
  ll mid=tr[u].l+tr[u].r>>1;
  pushdown(u);
  ll res=0;
  if(l<=mid){
    res+=query(u<<1,l,r);
  }
  if(r>=mid+1){
    res+=query(u<<1|1,l,r);
  }
  return res;
}
int main(){
  cin>>n>>q;
  for(ll i=1;i<=n;++i){
    cin>>a[i];
  }
  build(root,1,n);
  for(ll o,l,r,k;q--;){
    cin>>o>>l>>r;
    if(o==1){
      cin>>k;
      modify(root,l,r,k);
    }
    if(o==2){
      cout<<query(root,l,r)<<endl;
    }
  }
  return 0;
}

回复

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

正在加载回复...