RE求调

P3372 【模板】线段树 1

Never_Gone @ 2023-11-14 18:01:33

#include<bits/stdc++.h>
#define int long long 

using namespace std;
const int maxn=1000010;

int a[maxn],tag[maxn<<2],ans[maxn<<2];
int n,m;

int ls(int b){
    return b<<1;
}

int rs(int b){
    return b<<1|1;
}

void push_up(int b){
    ans[b]=ans[ls(b)]+ans[rs(b)];
}

void build(int p,int l,int r){
    //cout<<1<<endl;
    tag[p]=0;
    if(l==r) {ans[p]=a[l]; return;}
    int mid=(l+r)>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    push_up(p);
}

void f(int p,int l,int r,int k){
    tag[p]=tag[p]+k;
    ans[p]=ans[p]+k*(r-l+1);
}

void push_down(int p,int l,int r){
    int mid=(l+r)>>1;
    f(ls(p),l,mid,tag[p]);
    f(rs(p),mid+1,r,tag[p]);
    tag[p]=0;
}

void update(int nl,int nr,int l,int r,int p,int k){
    if(nl<=l && nr>=r) {//到达叶节点 
        ans[p]+=k*(r-l+1);
        tag[p]+=k;
        return;
    }

    push_down(p,l,r);//回溯 
    int mid=(l+r)>>1;
    if(nl<=mid) update(nl,nr,l,mid,ls(p),k);
    if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);
    push_up(p);
}

int query(int qx,int qy,int l,int r,int p){
    int cnt;
    if(qx<=l && qy>=r) return ans[p];
    int mid=(l+r)>>1;
    push_down(p,l,r);//回溯
    if(qx<=mid) cnt+=query(qx,qy,l,mid,ls(p));
    if(qy>mid) cnt+=query(qx,qy,mid+1,r,rs(p));
    return cnt; 
}

signed main()
{
    //cin.tie(0),cout.tie(0);
    //ios::sync_with_stdio(false);

    cin>>n>>m;  
    for(int i=1;i<=n;i++) cin>>a[i];

    build(n,n,1);
    //cout<<2;
    for(int i=1;i<=m;i++){
        int q;
        cin>>q;

        if(q==1){
            int b,c,d;
            cin>>b>>c>>d;
            update(b,c,1,n,1,d);
        }
        else{
            int b,c;
            cin>>b>>c;
            int d=query(b,c,1,n,1);
            cout<<d<<"\n";
        }
    }

    return 0;
}

by xjx13563169001 @ 2023-11-14 18:35:07

居然能遇到和我一样的线段树非结构体版本的。

两个问题:

1.main函数里调用build的时候参数写错了。

2.求和的时候cnt没有初始化。

多练几遍就好了。

求关注!


by xjx13563169001 @ 2023-11-14 18:35:53

@Never_Gone


by Never_Gone @ 2023-11-15 16:13:18

@xjx13563169001

艹,犯傻写错了谢谢,已关


|