gyc071116 @ 2024-08-01 21:50:31
除了#1全WA,样例能过
#include<bits/stdc++.h>
#define ls (x<<1)
#define rs ((x<<1)|1)
#define int long long
using namespace std;
struct node{
int l;
int r;
int sum;
}tree[400005];
int a[100005],tag[400005];
void build_tree(int x,int l,int r){
if(l==r){
tree[x]=(node){l,l,a[l]};
return;
}
int mid=(l+r)>>1;
build_tree(ls,l,mid);
build_tree(rs,mid+1,r);
tree[x]=(node){l,r,tree[ls].sum+tree[rs].sum};
return;
}
void down(int x){
if(tag[x]){
tree[ls].sum=tree[ls].sum+(tree[ls].r-tree[ls].l+1)*tag[x];
tree[rs].sum=tree[rs].sum+(tree[rs].r-tree[rs].l+1)*tag[x];
tag[ls]+=tag[x];
tag[rs]+=tag[x];
tag[x]=0;
}
}
void update(int x){
tree[x].sum=tree[rs].sum+tree[ls].sum;
}
int search(int x,int l,int r){
if(tree[x].l>=l&&tree[x].r<=r){
return tree[x].sum;
}
if(tree[x].l>r||tree[x].r<l) return 0;
down(x);
return search(ls,l,r)+search(rs,l,r);
}
void add(int x,int l,int r,int k){
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
tag[x]+=k;
return;
}
if(tree[x].l>r||tree[x].r<l) return;
add(ls,l,r,k);
add(rs,l,r,k);
update(x);
}
signed main(){
int n,m;
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build_tree(1,1,n);
for(int i=1;i<=m;i++){
int op;
scanf("%lld",&op);
if(op==1){
int xx,yy,k;
scanf("%lld %lld %lld",&xx,&yy,&k);
add(1,xx,yy,k);
}
if(op==2){
int xxx,yyy;
scanf("%lld %lld",&xxx,&yyy);
printf("%lld\n",search(1,xxx,yyy));
}
}
return 0;
}
by sutiancheng @ 2024-08-01 22:00:59
add函数内要down(x)
void add(int x,int l,int r,int k){
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
tag[x]+=k;
return;
}
if(tree[x].l>r||tree[x].r<l) return;
down(x);
add(ls,l,r,k);
add(rs,l,r,k);
update(x);
}
by gyc071116 @ 2024-08-02 06:46:22
@sutiancheng 谢谢大佬
by piano_pei @ 2024-08-03 00:06:21
你没开