AC#1十分求调,样例过
查看原帖
AC#1十分求调,样例过
439165
小涛涛??楼主2024/8/13 14:57

代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=2010000;
int n,m;
int a[N];
int ju;
struct node
{
	int l,r,sum,lz;
}tr[N];
void build(int k,int l,int r)
{
	tr[k].l=l;
	tr[k].r=r;
	if(l==r)
	{
		tr[k].sum=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(2*k,l,mid);
	build(2*k+1,mid+1,r);
	tr[k].sum=tr[2*k].sum+tr[2*k+1].sum;
}
void lazy(int k,int l,int r,int t)
{
	tr[k].sum+=t*(r-l+1);
	tr[k].lz+=t;
}
void down(int k,int l,int r)
{
	int mid=(l+r)/2;
	lazy(2*k,l,mid,tr[k].lz);
	lazy(2*k+1,mid+1,r,tr[k].lz);
	tr[k].lz=0;
}
void update(int l,int r,int k,int t)
{
	if(l<=tr[k].l&&r>=tr[k].r)
	{
		lazy(k,tr[k].l,tr[k].r,t);
 		return;
	}
	if(tr[k].lz)
	{
		down(k,l,r);
	}
	int mid=(tr[k].l+tr[k].r)/2;
	if(l<=mid)
	{
		update(l,r,2*k,t);
	}
	if(r>mid)
	{
		update(l,r,2*k+1,t);
	}
	tr[k].sum=tr[2*k].sum+tr[2*k+1].sum;
}
int query(int k,int l,int r,int ll,int rr)
{
	int ss=0;
	if(l>=ll&&r<=rr)
	{
		return tr[k].sum;
	}
	if(tr[k].lz!=0)
	{
		down(k,l,r);
	}
	int mid=(l+r)/2;
	if(ll<=mid)
	{
		ss+=query(2*k,l,mid,ll,rr);
	}
	if(rr>mid)
	{
		ss+=query(2*k+1,mid+1,r,ll,rr);
	}
	return ss;
}
//int in()
//{
//	 int ans=0,ff=1;
//	 int c=getchar();
//	 for(;!isdigit(c);c=getchar())
//	 {
//		 if(c=='-')
//		 {
//			ff=-1;
//		 }
//	 }
//	 for(;isdigit(c);c=getchar())
//	 {
//		 ans=ans*10+c-'0';
//	 }
//	 return ans*ff;
//}
void out(int x)
{
	 if(x<0)
	 {
		 putchar('-');
		 x=-x;
	 }
	 if(x>=10)
	 {
		 out(x/10);
	 }
	 putchar(x%10+'0');
}
int main()
{
	cin>>n;
	cin>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		cin>>ju;
		if(ju==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			update(x,y,1,k);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			out(query(1,1,n,x,y));
			puts("");
		}
	}
	return 0;
}

2024/8/13 14:57
加载中...