用了懒人还是3tle了,求助!!
查看原帖
用了懒人还是3tle了,求助!!
614984
NNNNzh楼主2022/5/1 23:23
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1e7;
int a[500010];
int ans=0;
struct lintr
{
	struct node{
		int l,r,sum,lz;
	}tr[maxn];	
	void push_down(int p)
	{
		if(tr[p].lz!=0)
		{
			tr[p*2].lz+=tr[p].lz;
			tr[p*2+1].lz+=tr[p].lz;
			int mid=(tr[p].l+tr[p].r)>>1;
			tr[p*2].sum+=tr[p].lz*(mid-tr[p*2].l+1);
			tr[p*2+1].sum+=tr[p].lz*(tr[p*2+1].r-mid);
			tr[p].lz=0;
		}
		return; 
	}
	void build(int p,int l,int r)
	{
		tr[p]={l,r,0};
		if(l==r)
		{
			tr[p].sum=a[l];
			return;
		}
		int mid=(l+r)>>1;
		build(p*2,l,mid);
		build(p*2+1,mid+1,r);
		tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
	}
	void  search(int p,int l,int r)
	{
		if(tr[p].l>=l&&tr[p].r<=r)
		{
			ans+=tr[p].sum;
			return;
		}
		push_down(p);
		int mid=(tr[p].l+tr[p].r)>>1;
		if(l<=mid)search(p*2,l,r);
		if(mid<r)search(p*2+1,l,r);
	}
	void add(int p,int l,int r,int k)
	{
		if(tr[p].l==tr[p].r)
		{
			tr[p].sum+=k*(tr[p].r-tr[p].l+1);
			tr[p].lz+=k;
			return;
		}
		push_down(p);
		int mid=(tr[p].l+tr[p].r)>>1;
		if(mid>=l)
		{
			add(p*2,l,r,k);
		}
		if(mid<r)
		{
			add(p*2+1,l,r,k);
		}
		tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
		return ;
	}

}st;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    	cin>>a[i];
	}
	st.build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int x,c,d,f;
		cin>>x;
		if(x==1)
		{
			cin>>c>>d>>f;
			st.add(1,c,d,f);
		}
		else
		{
			cin>>c>>d;
		ans=0; 
			st.search(1,c,d);
			printf("%d\n",ans);
		}
	}
}
2022/5/1 23:23
加载中...