样例过0pts 求助

P3372 【模板】线段树 1

绝尘影_Sheldow @ 2022-11-24 21:12:55

RT Code:

//head
#include<iostream>
using namespace std;
//update the tree
struct ltr
{
    long long w,tag;
}tr[414514];
int n,m,x,y,op;
long long k,a[114514];
void upd(int u)
{
    tr[u].w=tr[u*2].w+tr[u*2+1].w;
}
void build(int u,int l,int r)
{
    if(l==r)
    {
        tr[u].w=a[l];
        return;
    }
    build(u*2,l,(l+r)/2);
    build(u*2+1,(l+r)/2+1,r);
    upd(u);
}
//plus a number to a range
bool ifcontained(int ll,int rr,int l,int r) {return (l<=ll)&&(r>=rr);}
bool ifnotrelated(int ll,int rr,int l,int r) {return (ll>r)||(rr<l);}
void maketag(int u,int len,long long num)
{
    tr[u].tag+=num;
    tr[u].w+=len*num;
}
void pushdown(int u,int l,int r)
{
    maketag(u*2,(l+r)/2-l+1,tr[u].tag);
    maketag(u*2+1,r-(l+r)/2,tr[u].tag);
    tr[u].tag=0;
}
void add(int u,int ll,int rr,int l,int r,long long num)
{
    if(ifcontained(ll,rr,l,r))
    {
        maketag(u,ll-rr+1,num);
    }
    else if(!ifnotrelated(ll,rr,l,r))
    {
        pushdown(u,ll,rr);
        add(u*2,ll,(ll+rr)/2,l,r,num);
        add(u*2+1,(ll+rr)/2+1,rr,l,r,num);
        upd(u);
    }
}
//search the answer
long long search(int u,int ll,int rr,int l,int r)
{ 
    if(ifcontained(ll,rr,l,r)) return tr[u].w;
    if(!ifnotrelated(ll,rr,l,r)) 
    {
        pushdown(u,ll,rr);
        return search(u*2,ll,(ll+rr)/2,l,r)+search(u*2+1,(ll+rr)/2+1,rr,l,r);
    }
    return 0;
}
//main code
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        cin>>op;
        if(op==1)
        {
            cin>>x>>y>>k;
            add(1,1,n,x,y,k);
        }
        if(op==2)
        {
            cin>>x>>y;
            cout<<search(1,1,n,x,y)<<endl; 
        }
    }
}
// YEEEEES!

by TankYu @ 2022-11-24 21:17:53

@绝尘影_Sheldow add里面maketag的len传参错了


by 绝尘影_Sheldow @ 2022-11-24 21:24:36

@TankYu 看到了,是rr-ll+1 过了!Thanks


|