救救孩子吧,为什么全都wa了

P3372 【模板】线段树 1

Kyoma_T @ 2024-04-29 21:42:39

#include<cstdio>
#include<iostream>
#include<algorithm> 
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
const int N=1e5+10;
int a[N];
long long ans=0;
int n,q;
struct node{
    int l;
    int r;
    long long sum;
    long long lz;
}tr[4*N];
void build(int p,int l,int r)
{
    tr[p].l=l,tr[p].r=r;tr[p].lz=0;
    if(l==r)
    {
       tr[p].sum=a[l];
       return;  
    }
    int mid=(l+r)>>1;
    build(p<<1,l,mid),build(p<<1|1,mid+1,r);
    tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
}
void push_down(int p)
{
    int k=tr[p].lz;
    if(tr[p].lz!=0)
    {
        tr[p<<1].sum+=k*(tr[p<<1].r-tr[p<<1].l+1);
        tr[p<<1].lz+=k;
        //push_down(p<<1);
        tr[p<<1|1].sum+=k*(tr[p<<1|1].r-tr[p<<1|1].l+1);
        tr[p<<1|1].lz+=k;
        //push_down(p<<1|1);
        tr[p].lz=0;
    }
    return;
}
void modify(int p,int l,int r,int x)
{
    int a=tr[p].l,b=tr[p].r;
    if(tr[p].l>=l&&tr[p].r<=r)
    {
        tr[p].sum+=x*(b-a+1);
        tr[p].lz+=x;
        //push_down(p);
        return;
    }
    int mid=(tr[p].l+tr[p].r)>>1;
    if(l<=mid)modify(p<<1,l,r,x);
    if(r>=mid+1)modify(p<<1|1,l,r,x);
    tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
    return;
 }
long long query(int p,int l,int r)
 {
    //printf("%d %d %d",p,l,r);
    if(tr[p].l>=l&&tr[p].r<=r)
    {
        return tr[p].sum;
        //printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
        //printf("%d\n",r);
     }
     push_down(p);
     long long s=0;
     int mid=tr[p<<1].r;
     //printf("mid=%d\n",mid);
     if(l<=mid)
     {
        //printf("l=%d<mid=%d\n",l,mid);
        //printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
        s+=query(p<<1,l,mid);
        //printf("%d\n",mid); 
     }
     if(r>mid)
     {
        //printf("r=%d>mid=%d\n",r,mid);
        //printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
        s+=query(p<<1|1,mid+1,r);
        //printf("%d %d %d\n",tr[p<<1|1].r,r,mid+1);
     }
     return s;
} 

int main()
{

    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    build(1,1,n);
    //for(int i=1;i<=4*n;i++)
    //      printf("%d %d %d\n",tr[i].l,tr[i].r,tr[i].sum);
    while(q--)
    {
        int k;
        scanf("%d",&k);
        if(k==1)
        {
            int l,r,x;
            scanf("%d%d%d",&l,&r,&x);
            modify(1,l,r,x);
            //for(int i=1;i<=4*n;i++)
            //printf("%d %d %d\n",tr[i].l,tr[i].r,tr[i].sum);
        }
        else if(k==2)
        {
            ans=0;
            int l,r;
            scanf("%d%d",&l,&r);
            printf("%lld\n",query(1,l,r));
        }

    }
    //for(int i=1;i<=4*n;i++)
    //      if(tr[i].l==tr[i].r&&tr[i].l!=0)printf("%d %d\n",tr[i].l,tr[i].sum);
    return 0;
} 

by zzxLLL @ 2024-04-29 21:46:02

@Kyoma_T pushdown 里面 int k 变成 long long k?


by Kyoma_T @ 2024-04-29 21:53:55

@zzxLLL 改了还是不行


by zzxLLL @ 2024-04-29 21:58:12

@Kyoma_T

s+=query(p<<1,l,mid) 改成 s+=query(p<<1,l,r)

s+=query(p<<1|1,mid+1,r) 改成 s+=query(p<<1|1,l,r)


by Kyoma_T @ 2024-04-29 22:07:48

@zzxLLL 改完a了两个点,还是没过


by xxboyxx @ 2024-04-29 22:21:44

@Kyoma_T modify函数没传懒标记,加上后实测已过


by Kyoma_T @ 2024-04-29 22:48:23

@xxboyxx 确实确实,谢谢佬 ,但是为什么modify还要传啊,query查的时候不是可以把要用的懒标记都传了吗?


by xxboyxx @ 2024-04-29 22:53:12

@Kyoma_T 但是如果是一连串的修改操作呢?


by Kyoma_T @ 2024-04-29 23:33:25

@xxboyxx 啊啊啊,谢谢大佬,想了半天又画了图才明白,是因为需要lazy下传后更改原来的sum,谢谢大佬,orz


|