tle三个点求助
查看原帖
tle三个点求助
377899
gzxhahaha49楼主2021/3/29 19:49
#include <iostream>
#include <string>
using namespace std;
#define int long long
const int N=1e5+5;
int ori[N],n;

struct segment_tree{
    int lc[4*N],rc[4*N],l[4*N],r[4*N],tot,sum[4*N],tag[4*N];
    void  build_node(int i,int x,int y){
        tot=i;l[tot]=x;r[tot]=y;tag[tot]=0;
        if (x==y)
        {
            sum[tot]=ori[x];
            return;
        }
        int mid=(x+y)>>1;
        lc[i]=tot+1;build_node(tot+1, x, mid);
        rc[i]=tot+1;build_node(tot+1, mid+1,y);
        sum[i]=sum[lc[i]]+sum[rc[i]];
    }
    int quiry_node(int p,int lsum,int rsum){
        if (l[p]==r[p])
        {
            sum[p]+=tag[p];tag[p]=0;
            return sum[p];
        }
        if (tag[p]){
            sum[p]+=tag[p]*(r[p]-l[p]+1);
            tag[lc[p]]+=tag[p];
            tag[rc[p]]+=tag[p];
            tag[p]=0;
        }
        int mid=(l[p]+r[p])>>1;
        if (rsum<=mid) return quiry_node(lc[p],lsum, rsum);
        if (lsum>mid) return quiry_node(rc[p],lsum, rsum);
        return quiry_node(lc[p], lsum, mid)+quiry_node(rc[p], mid+1, rsum);
    }
    void update_node(int x,int p,int lup,int rup){
        if (l[p]>=lup&&r[p]<=rup)
        {
            tag[p]+=x;
            return;
        }
        sum[p]+=x*(rup-lup+1);
        int mid=(l[p]+r[p])>>1;
        if (rup<=mid)
        {
            update_node(x,lc[p],lup, rup);
            return;
        }
        if (lup>mid)
        {
            update_node(x,rc[p],lup, rup);
            return;
        }
        update_node(x,lc[p],lup,mid);
        update_node(x,rc[p],mid+1,rup);
    }
    int quiry (int x,int y){
        return quiry_node(1,x,y);
    }
    void update(int x,int ll,int rr){
        update_node(x,1,ll,rr);
    }
    void build(int n){
        build_node(1,1,n);
    }
}tr;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int cas=0,T,x,y,k;
    string str;
    cin>>n;cin>>T;
    for (int i=1;i<=n;i++) cin>>ori[i];
    tr.build(n);
    while (T--){
        cin>>str;
        if (str=="1"){
            cin>>x>>y>>k;
            tr.update(k,x,y);
        }
        else {
            cin>>x>>y;
            cout<<tr.quiry(x, y)<<endl;
        }
    }
    return 0;
}

不知道怎么描述我的错误,以前基本上都是照着板子打的线段树,现在自己写了一次果然错了……如果有大佬指点我一下就好了

2021/3/29 19:49
加载中...