萌新线段树1全wa求助
  • 板块学术版
  • 楼主shua1diyapi
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/3 20:27
  • 上次更新2023/10/27 08:58:38
查看原帖
萌新线段树1全wa求助
291397
shua1diyapi楼主2022/10/3 20:27
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=1e5+5; 
int n,m,A[N];
struct Node
{
	int l,r;
	ll sum,lz;
}T[N*8];
void pushup(int rt)
{
	T[rt].sum=T[rt<<1].sum+T[rt<<1|1].sum;
}
void pushdown(int rt)
{
	ll lzz=T[rt].lz;
	if(lzz>0)
	{
		T[rt<<1].lz+=lzz;
		T[rt<<1|1].lz+=lzz;
		T[rt<<1].sum+=(T[rt<<1].r-T[rt<<1].l+1)*lzz;
		T[rt<<1|1].sum+=(T[rt<<1|1].r-T[rt<<1|1].l+1)*lzz;
		T[rt].lz=0;
	}	
	
}
void build(int rt,int l,int r)
{
//	T[rt].l=l,T[rt].r=r;
	T[rt]={l,r,0,0};
	if(l==r)
	{
		T[rt].sum=A[l];
		return ;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	pushup(rt);
}
void modify(int rt,int l,int r,int k)
{
	if(T[rt].l>=l && T[rt].r<=r)
	{
		T[rt].lz+=k;
		T[rt].sum+=(T[rt].r-T[rt].l+1)*k;
		return ;
	}
	pushdown(rt);
	int mid=T[rt].l+T[rt].r>>1;
	if(mid>=l)		modify(rt<<1,l,r,k);
	if(mid<r)	modify(rt<<1|1,l,r,k);
	pushup(rt);	
}
ll query(int rt,int l,int r)
{
	if(T[rt].l>=l && T[rt].r<=r)
		return T[rt].sum;
	pushdown(rt);
	ll s=0;
	int mid=T[rt].l+T[rt].r>>1;
	if(mid>=l)		s+=(rt<<1,l,r);
	if(mid<r)		s+=(rt<<1|1,l,r);	
	return s;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>A[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op,x,y,k;
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>k;
			modify(1,x,y,k);
		}
		else
		{
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;	
		}
	}
	return 0;
}
2022/10/3 20:27
加载中...