RE求调

P3372 【模板】线段树 1

GODTREE @ 2024-07-23 14:31:53

#include <bits/stdc++.h>
using namespace std;
#define N 10000005
int n,m,a[N];
struct tree
{
    int val,laz,l,r;
}sg[N*4];
void build(int s,int t,int p)//对[s,t]区间建立线段树,p为编号
{
    sg[p].l=s;
    sg[p].r=t;
    if (s==t)
    {
        sg[p].val=a[s];
        return ;
    }
    int mid=s+((t-s)/2);//(t+s)/2会炸int
    build(s,mid,p*2);
    build(mid+1,s,p*2+1);
    //左右建树
    sg[p].val=sg[p*2].val+sg[(p*2)+1].val;
}
void add(int l,int r,int k,int p)
{
    if (sg[p].r<l||sg[p].l>r)
    {
        return ;
    }
    if(sg[p].l>=l&&sg[p].r<=r)
    {
        sg[p].val+=(l-r+1)*k,sg[p].laz+=k;
        return ;
    }
    int mid=sg[p].l+((sg[p].l-sg[p].r)/2);
    if (sg[p].laz!=0&&l!=r)
    {
        sg[p*2].val+=sg[p].laz*(mid-l+1);
        sg[p*2+1].val+=sg[p].laz*(r-mid);
        sg[p].laz=0;
    }
    if (sg[p].l<=mid)
    {
        add(l,r,k,p*2);
    }
    else
    {
        add(l,r,k,p*2+1);
    }
    sg[p].val=sg[p*2].val+sg[p*2+1].val;
    return ;
}
int query(int l,int r,int p)
{
    if (l>=sg[p].l&&r<=sg[p].r)
    {
        return sg[p].val;
    }
    int mid=sg[p].l+((sg[p].r-sg[p].l)/2);
    if (sg[p].laz!=0)
    {
        sg[p*2].val+=sg[p].laz*(mid-l+1);
        sg[p*2+1].val+=sg[p].laz*(r-mid);
        sg[p].laz=0;
    }
    int sum=0;
    if (l<=mid)
    {
        sum+=query(l,r,p*2);
    }
    if (r>mid)
    {
        sum+=query(l,r,p*2+1);
    }
    return sum;
}
int main()
{
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    build(1,n,1);
    for (int i=1;i<=m;i++)
    {
        int opt;
        cin>>opt;
        if (opt==1)
        {
            int x,y,k;
            cin>>x>>y>>k;
            add(x,y,k,1);
        }
        else
        {
            int x,y;
            cout<<query(x,y,1)<<"\n";
        }
    }
    return 0;
}

by absolute_value @ 2024-07-23 14:37:49

sg[p].val+=(l-r+1)*k,sg[p].laz+=k;

这行是不是弄错了,l-r+1会变成负数吧


by GODTREE @ 2024-07-23 15:23:22

@absolute_value 是个问题,但RE解决不了


by Mr_Dolphin @ 2024-07-23 16:55:33

#include <bits/stdc++.h>
#define int long long
using namespace std;
#define N (int)1e6+10
int n,m,a[N];
struct tree
{
    int val,laz,l,r;
}sg[N*4];
void build(int s,int t,int p)//对[s,t]区间建立线段树,p为编号
{
    sg[p].l=s;
    sg[p].r=t;
    if (s==t)
    {
        sg[p].val=a[s];
        return ;
    }
    int mid=t+s>>1;//(t+s)/2会炸int
    build(s,mid,p*2);
    build(mid+1,t,p*2+1);
    //左右建树
    sg[p].val=sg[p*2].val+sg[(p*2)+1].val;
}
void add(int l,int r,int k,int p)
{
    if(sg[p].l>=l&&sg[p].r<=r)
    {
        sg[p].val+=(sg[p].r-sg[p].l+1)*k,sg[p].laz+=k;
        return ;
    }
    int mid=sg[p].r+sg[p].l>>1;
    if (sg[p].laz)
    {
        sg[p*2].val+=sg[p].laz*(sg[p<<1].r-sg[p<<1].l+1);
        sg[p*2+1].val+=sg[p].laz*(sg[p<<1|1].r-sg[p<<1|1].l+1);
        sg[p<<1].laz+=sg[p].laz;
        sg[p<<1|1].laz+=sg[p].laz;
        sg[p].laz=0;
    }
    if (mid>=l)
    {
        add(l,r,k,p*2);
    }
    if(mid<r)
    {
        add(l,r,k,p*2+1);
    }
    sg[p].val=sg[p*2].val+sg[p*2+1].val;
    return ;
}
int query(int l,int r,int p)
{
//  cout<<p<<' '<<sg[p].l<<' '<<sg[p].r<<' '<<l<<' '<<r<<endl;
    if (l<=sg[p].l&&r>=sg[p].r)
    {
        return sg[p].val;
    }
    int mid=sg[p].l+sg[p].r>>1;
    if (sg[p].laz)
    {
        sg[p*2].val+=sg[p].laz*(sg[p<<1].r-sg[p<<1].l+1);
        sg[p*2+1].val+=sg[p].laz*(sg[p<<1|1].r-sg[p<<1|1].l+1);
        sg[p<<1].laz+=sg[p].laz;
        sg[p<<1|1].laz+=sg[p].laz;
        sg[p].laz=0;
    }
    int sum=0;
    if (l<=mid)
    {
        sum+=query(l,r,p*2);
    }
    if (r>mid)
    {
        sum+=query(l,r,p*2+1);
    }
    return sum;
}
signed main()
{
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    build(1,n,1);
    for (int i=1;i<=m;i++)
    {
        int opt;
        cin>>opt;
        if (opt==1)
        {
            int x,y,k;
            cin>>x>>y>>k;
            add(x,y,k,1);
        }
        else
        {
            int x,y;
            cin>>x>>y;
            cout<<query(x,y,1)<<"\n";
        }
    }
    return 0;
}

by Mr_Dolphin @ 2024-07-23 16:56:00

@GODTREE


by 云翩 @ 2024-07-23 18:11:41

@GODTREE 开longlong


by GODTREE @ 2024-08-24 19:46:04

谢谢 @云翩 @Mr_Dolphin


|