全RE T_T 本地无输出
查看原帖
全RE T_T 本地无输出
786726
kobebraint楼主2024/8/2 12:07

cerr是调试用的,不影响正常输出

机房里好多佬也没看出来哪里有问题

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define cl(a) memset(a,0,sizeof a)
#define szread(a,n); for(ll i=1;i<=n;i++){cin>>a[i];}
#define forn(i,n) for(ll i=1;i<=n;i++)
#define copy(a,b) copy(begin(a),end(a),begin(b))
#define fin(a) freopen(a,"r",stdin)
#define fout(a) freopen(a,"w",stdout)
#define ferr(a) freopen(a,"w",stderr)

ll  n,m,a[1000500],segment_tree[4000500],
    op,x,y,k,lazy_tag[4000500];

void build_segment_tree(ll l,ll r,ll k){
    if(l==r){
        segment_tree[k]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build_segment_tree(l,mid,k<<1);
    build_segment_tree(mid+1,r,k<<1|1);
    segment_tree[k]=segment_tree[k<<1]+segment_tree[k<<1|1];
}

void push_down(ll l,ll r,ll mid,ll k){
    segment_tree[k<<1]+=(mid-l+1)*lazy_tag[k];
    segment_tree[k<<1|1]+=(r-mid)*lazy_tag[k];
    lazy_tag[k<<1]+=lazy_tag[k];
    lazy_tag[k<<1|1]+=lazy_tag[k];
    lazy_tag[k]=0;
}

//l,r为k包含区间,s,e修改
void addition_segment_tree(ll l,ll r,ll k,ll s,ll e,ll x){
    cerr<<1<<"#\n";
    if(s<=l&&r<=e){
        segment_tree[k]+=(e-s+1)*x;
        lazy_tag[k]+=x;
        return;
    }
    ll mid=(l+r)>>1;
    if(lazy_tag[k]&&l!=r){
        push_down(l,r,mid,k);
    }
    if(l<=mid){
        addition_segment_tree(l,mid,k<<1,s,e,x);
    }
    if(r>mid){
        addition_segment_tree(mid+1,r,k<<1|1,s,e,x);
    }
}

//l,r为k包含区间,s,e查询
ll sum_segment_tree(ll l,ll r,ll k,ll s,ll e){
    cerr<<2<<"#\n";
    if(s<=l&&e>=r){
        return segment_tree[k];
    }
    ll mid=(l+r)>>1,sum;
    if(lazy_tag[k]){
        push_down(l,r,mid,k);
    }
    cerr<<"**^\n";
    sum=sum_segment_tree(l,mid,k<<1,s,e);
    sum+=sum_segment_tree(mid+1,r,k<<1|1,s,e);
    cerr<<3<<"#\n";
    return sum;
}

int main(){
    cin>>n>>m;
    cerr<<m<<endl;
    for(long long i=1;i<=n;i++){
        cin>>a[i];
    }
    build_segment_tree(1,n,1);
    cerr<<"*"<<m<<endl;
    for(long long i=1;i<=m;i++){
        cin>>op>>x>>y;
        cerr<<"##"<<op<<"#"<<i<<endl;
        if(op==1){
            cin>>k;
            cerr<<"4#\n";
            addition_segment_tree(1,n,1,x,y,k);
        }else{
            cerr<<"5#\n";
            cout<<sum_segment_tree(1,n,1,x,y)<<endl;
        }
    }
    return 0;
}
2024/8/2 12:07
加载中...