70tps求调

P3372 【模板】线段树 1

Love__Elaina @ 2023-03-25 10:47:50

rt,调了好久好久还没调出来,只能发帖求助了,测试点信息如下

最后三个点不输出

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[500100];
struct snode{
    int l,r;
    int sum;
    int lazy=0;
}t[500100];
void creat_tree(int l,int r,int k);
void change_interval(int l,int r,int x,int k);//将 l-r区间内的元素加上 x 
void pushdown(int k);
int ask_sum(int k,int l,int r);//查询区间 [l,r] 的和 
signed main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    creat_tree(1,n,1);
    for(int i=0;i<m;i++) 
    {
        int l,x,y,z;
        scanf("%d",&l);
        if(l==1) 
        {
            scanf("%d%d%d",&x,&y,&z);
            change_interval(x,y,z,1);
        // for(int j=1;j<=n*2-1;j++)cout<<t[j].l<<' '<<t[j].r<<' '<<t[j].sum<<' '<<t[j].lazy<<'\n';
        }
        if(l==2)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",ask_sum(1,x,y));
        }
    }
    /*cout<<t[1].l<<' '<<t[1].r<<' '<<t[1].sum<<endl;
    cout<<t[2].l<<' '<<t[2].r<<' '<<t[2].sum<<endl;
    cout<<t[3].l<<' '<<t[3].r<<' '<<t[3].sum<<endl;*/
    return 0;
}
void creat_tree(int l,int r,int k)
{
    int mid=(r+l)/2;
    t[k].l=l,t[k].r=r;
    if(l==r){
        t[k].sum=a[l];
        return;
    }
    creat_tree(l,mid,2*k);//建立左子树 
    creat_tree(mid+1,r,2*k+1);//建立右子树 
    t[k].sum=t[2*k].sum+t[2*k+1].sum;
}
void change_interval(int l,int r,int x,int k)//时间复杂度:O(logN) 
{
    if(t[k].r<=r && t[k].l>=l)//如果当前区间被完全覆盖在目标区间里,将这个区间的sum+k*(tree[i].r-tree[i].l+1)
    {
        t[k].sum+=x*(t[k].r-t[k].l+1);
        t[k].lazy+=x;//记录lazytage
        return ;
    }
    pushdown(k);//向下传递
    if(t[k*2].r>=l)change_interval(l,r,x,k*2);
    if(t[k*2+1].l<=r)change_interval(l,r,x,k*2+1);
    t[k].sum=t[k*2].sum+t[k*2+1].sum;
    return;
}
void pushdown(int k)//将点k的懒惰标记下传
{
    if(t[k].l==t[k].r){t[k].lazy=0;return;}
    t[k*2].sum+=(t[k*2].r-t[k*2].l+1)*t[k].lazy;
    t[k*2+1].sum+=(t[k*2+1].r-t[k*2+1].l+1)*t[k].lazy;
    t[k*2].lazy+=t[k].lazy;
    t[k*2+1].lazy+=t[k].lazy;
    t[k].lazy=0; 
} 
inline int ask_sum(int k,int l,int r)
{
    if(t[k].l>=l && t[k].r<=r)return t[k].sum;
    if(t[k].r<l || t[k].l>r)  return 0;
    pushdown(k);
    int s=0;
    if(t[k*2].r>=l)  s+=ask_sum(k*2,l,r);
    if(t[k*2+1].l<=r)  s+=ask_sum(k*2+1,l,r);
    return s;
}                              

by Nephren_Sakura @ 2023-03-31 11:10:35

@ylnawy

你开了 long long 为什么要用 %d 输出啊

全部改成 %lld 就过了


by Dense7fog @ 2023-03-31 11:52:13

@_ChthollyNephren 我开long long后面三个也wa了啊,看测试数据发现我有的数据正数变成了负数


by Love__Elaina @ 2023-03-31 13:19:29

@_ChthollyNephren

非常感谢,众神之父会庇佑你


by Nephren_Sakura @ 2023-03-31 14:02:03

@shjkxi

?你输出的时候输出的是int啊,%d输出的是int


|