重新敲一边模板结果又挂了
查看原帖
重新敲一边模板结果又挂了
164840
zhaowangji楼主2020/7/28 16:56

各个地方都对着看了,读入也对着看了,但还是输出错误结果

#include<bits/stdc++.h>
using namespace std;
int n,m;
unsigned long long a[100007];
struct SegementTree{
    int l,r;
    unsigned long long sum;
    int flag;
}t[400007];
void pushup(int id){
    t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
    return;
}
void pushdown(int id){
    if(t[id].flag){
        t[id<<1].sum+=t[id].flag*(t[id<<1].r-t[id<<1].l+1);
        t[id<<1|1].sum+=t[id].flag*(t[id<<1|1].r-t[id<<1|1].l+1);
        t[id<<1].flag+=t[id].flag;
        t[id<<1|1].flag+=t[id].flag;
        t[id].flag=0;
    }
    return;
}
void build(int id,int l,int r){
    t[id].l=l;t[id].r=r;
    if(l==r){
        t[id].sum=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(id<<1,l,mid);
    build(id<<1|1,mid+1,r);
    pushup(id);
    return;
}
void update(int id,int l,int r,int k){
    if(l<=t[id].l&&t[id].r<=r){
        t[id].sum+=k*(t[id].r-t[id].l+1);
        t[id].flag+=k;
        return;
    }
    pushdown(id);
    int mid=(t[id].l+t[id].r)>>1;
    if(l<=mid)update(id<<1,l,r,k);
    if(r>mid)update(id<<1|1,l,r,k);
    pushup(id);
    return;
}
unsigned long long query(int id,int l,int r){ 
    if(l<=t[id].l&&t[id].r<=r)return t[id].sum;
    pushdown(id);
    int mid=(t[id].l+t[id].r)>>1;
    if(r<=mid)return query(id<<1,l,r);
    else if(l>mid)return query(id<<1|1,l,r);
    else return query(id<<1,l,r)+query(id<<1,l,r);
}
int Read(){
    char x=getchar();int res=0,flag=1;
    while(x<'0'||x>'9'){
        if(x=='-')flag=-1;
        x=getchar();
    }
    while(x>='0'&&x<='9'){
        res=res*10+x-'0';
        x=getchar();
    }
    return flag*res;
}
int main(){
    n=Read();m=Read();
    for(int i=1;i<=n;++i)
        a[i]=Read();
    build(1,1,n);
    for(int i=1;i<=m;++i){
        char ch=getchar();
        while(ch!='1'&&ch!='2')ch=getchar();
        if(ch=='1'){
            int x,y,k;x=Read();y=Read();k=Read();
            update(1,x,y,k);
        }
        else{
            int x,y;x=Read();y=Read();
            printf("%lld\n",query(1,x,y));
        }
    }
    return 0;
}
2020/7/28 16:56
加载中...