一个同学写的线段树,炸了求助
查看原帖
一个同学写的线段树,炸了求助
184055
Beyond616楼主2020/10/16 16:43
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define for(a,b,c) for(int a=b;a<=c;a++)
const int N=4e5+50,M=1e5+50;
long long tree[N],a[M];
int tl[N],tr[N],tmid[N],lazy[N];
void maketree(int x,int l,int r);
void pushdown (int x);
void Replace (int x);
long long Find(int x,int l,int r);


void maketree(int x,int l,int r)//当前x 左l 右r
{
tr[x]=r;
tl[x]=l;
lazy[x]=0;
if(l==r)
{
tree[x]=a[l];
}
else
{
int mid=(l+r)/2;
tmid[x]=mid;
maketree(x*2,l,mid);
maketree(x*2+1,mid+1,r);
Replace(x);
}
}

void pushdown (int x)
{


if(tl[x]<tr[x])
{

if(tl[x*2]<=tr[x*2]) 
{
tree[x*2]+=(tr[x*2]-tl[x*2]+1)*lazy[x];
lazy[x*2]+=lazy[x];
}


if(tl[x*2+1]<=tr[x*2+1]) 
{
tree[x*2+1]+=(tr[x*2+1]-tl[x*2+1])*lazy[x];
lazy[x*2+1]+=lazy[x];
}
Replace(x);

}


lazy[x]=0;
}

void Replace (int x)
{
tree[x]=tree[x*2]+tree[x*2+1];
}


void add(int x,int l,int r,long long k)
{
if(tr[x]==r && tl[x]==l)
{
tree[x]+=(r-l+1)*k;
lazy[x]+=k;
return;
}
pushdown(x);
 if(r<=tmid[x])
{
add(x<<1,l,r,k);
}
else if(l>tmid[x])
{
add(x*2+1,l,r,k);
}
else
{
add(x<<1,l,tmid[x],k);
add(x*2+1,tmid[x]+1,r,k);
}
Replace(x);
}

long long Find(int x,int l,int r)
{

if(tr[x]==r && tl[x]==l)
{
return tree[x];
}
else if(r<=tmid[x])
{
return Find(x*2,l,r);
}
else if(l>tmid[x])
{
return Find(x*2+1,l,r);
}
else
{
return Find(x*2,l,tmid[x])+Find(x*2+1,tmid[x]+1,r);
}

}

int main()
{
int n,m;
 cin>>n>>m;
 for(i,1,n)
 cin>>a[i];
 maketree(1,1,n);
 for(i,1,m)
 {
 int opt;
 cin>>opt;
 if(opt==1)
 {
 int a,b,k;
 cin>>a>>b>>k;
 add(1,a,b,k);
 }
 if(opt==2)
 {
 int a,b;
 cin>>a>>b;
 long long res=Find(1,a,b);
 cout<<res<<endl;
 }
 }
 return 0;
}
2020/10/16 16:43
加载中...