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