70tps求调
查看原帖
70tps求调
776075
Love__Elaina楼主2023/3/25 10:47

rt,调了好久好久还没调出来,只能发帖求助了,测试点信息如下

最后三个点不输出

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[500100];
struct snode{
	int l,r;
	int sum;
	int lazy=0;
}t[500100];
void creat_tree(int l,int r,int k);
void change_interval(int l,int r,int x,int k);//将 l-r区间内的元素加上 x 
void pushdown(int k);
int ask_sum(int k,int l,int r);//查询区间 [l,r] 的和 
signed main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	creat_tree(1,n,1);
	for(int i=0;i<m;i++) 
	{
		int l,x,y,z;
		scanf("%d",&l);
		if(l==1) 
		{
			scanf("%d%d%d",&x,&y,&z);
			change_interval(x,y,z,1);
		// for(int j=1;j<=n*2-1;j++)cout<<t[j].l<<' '<<t[j].r<<' '<<t[j].sum<<' '<<t[j].lazy<<'\n';
		}
		if(l==2)
		{
			scanf("%d%d",&x,&y);
			printf("%d\n",ask_sum(1,x,y));
		}
	}
	/*cout<<t[1].l<<' '<<t[1].r<<' '<<t[1].sum<<endl;
	cout<<t[2].l<<' '<<t[2].r<<' '<<t[2].sum<<endl;
	cout<<t[3].l<<' '<<t[3].r<<' '<<t[3].sum<<endl;*/
	return 0;
}
void creat_tree(int l,int r,int k)
{
	int mid=(r+l)/2;
	t[k].l=l,t[k].r=r;
	if(l==r){
		t[k].sum=a[l];
		return;
	}
	creat_tree(l,mid,2*k);//建立左子树 
	creat_tree(mid+1,r,2*k+1);//建立右子树 
	t[k].sum=t[2*k].sum+t[2*k+1].sum;
}
void change_interval(int l,int r,int x,int k)//时间复杂度:O(logN) 
{
    if(t[k].r<=r && t[k].l>=l)//如果当前区间被完全覆盖在目标区间里,将这个区间的sum+k*(tree[i].r-tree[i].l+1)
    {
        t[k].sum+=x*(t[k].r-t[k].l+1);
        t[k].lazy+=x;//记录lazytage
        return ;
    }
    pushdown(k);//向下传递
    if(t[k*2].r>=l)change_interval(l,r,x,k*2);
    if(t[k*2+1].l<=r)change_interval(l,r,x,k*2+1);
    t[k].sum=t[k*2].sum+t[k*2+1].sum;
    return;
}
void pushdown(int k)//将点k的懒惰标记下传
{
	if(t[k].l==t[k].r){t[k].lazy=0;return;}
	t[k*2].sum+=(t[k*2].r-t[k*2].l+1)*t[k].lazy;
	t[k*2+1].sum+=(t[k*2+1].r-t[k*2+1].l+1)*t[k].lazy;
	t[k*2].lazy+=t[k].lazy;
	t[k*2+1].lazy+=t[k].lazy;
	t[k].lazy=0; 
} 
inline int ask_sum(int k,int l,int r)
{
    if(t[k].l>=l && t[k].r<=r)return t[k].sum;
    if(t[k].r<l || t[k].l>r)  return 0;
    pushdown(k);
    int s=0;
    if(t[k*2].r>=l)  s+=ask_sum(k*2,l,r);
    if(t[k*2+1].l<=r)  s+=ask_sum(k*2+1,l,r);
    return s;
}                              
2023/3/25 10:47
加载中...