新手学线段树全WA 求助
查看原帖
新手学线段树全WA 求助
882092
zMinYu楼主2023/4/12 10:17
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
struct node
{
	ll  l,r;
	ll num;
}tr[N*4];
ll a[N],lazy[N*4];
void pushup(ll u)
{
	tr[u].num=tr[u*2].num+tr[u*2+1].num;
}
void build(ll u,ll l,ll r)
{
	if(l==r)
	{
		tr[u].num=a[l];
		tr[u].l=l;
		tr[u].r=r;
	}
	else
	{
		tr[u].l=l;
		tr[u].r=r;
		int mid=(l+r)/2;
		build(u*2,l,mid);
		build(u*2+1,mid+1,r);
		pushup(u);
	}
}
//点修改
//void modify(int u,int l,int r,int x,int k) //将编号为x的值加k
//{
//	if(l==r)
//	{
//		tr[u].num=tr[u].num+k;
//	}
//	else
//	{
//		int mid=(l+r)/2;
//		if(x<=mid) modify(u*2,l,mid,x,k);
//		if(x>mid) modify(u*2,mid+1,r,x,k);
//		pushup(u);
//	}
//}
void pushdown(ll u,ll ln,ll rn)
{
	if(lazy[u])
	{
		lazy[u*2]+=lazy[u];
		lazy[u*2+1]+=lazy[u];
		tr[u*2].num+=lazy[u]*ln;
		tr[u*2+1].num+=lazy[u]*rn;
		lazy[u]=0;
	}
}
void modify(ll u,ll L,ll R,ll k)
{
	if(tr[u].l>=L&&tr[u].r<=R)
	{
		tr[u].num+=(tr[u].r-tr[u].l+1)*k;
		lazy[u]+=k;
	}
	else
	{
		ll mid=(tr[u].l+tr[u].r)/2;
		pushdown(u,mid-tr[u].l+1,tr[u].r-mid);
		if(L<=mid) modify(u*2,L,R,k);
		if(R>mid) modify(u*2+1,L,R,k);
		pushup(u);
	}
}
int query(ll u,ll L,ll R)
{
	if(tr[u].l>=L&&tr[u].r<=R)
	{
		return tr[u].num;
	}
	ll mid=(tr[u].l+tr[u].r)/2;
	ll ans=0;
	if(L<=mid) ans+=query(u*2,L,R);
	if(R>mid) ans+=query(u*2+1,L,R);
	return ans;
}
int main()
{
	ll n,m;cin>>n>>m;
	for(ll i=1;i<=n;i++)
	cin>>a[i];
	build(1,1,n);
	ll op,x,y,k;
	while(m--)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>k;
			modify(1,x,y,k);
		}
		else if(op==2)
		{
			cin>>x>>y;
			cout<<query(1,x,y)<<"\n";
		}
	}
	return 0;
}
2023/4/12 10:17
加载中...