2 条题解

  • 0
    @ 2025-3-23 16:49:33

    线段树可爱awa!!!

    #include<bits/stdc++.h>
    #define ls id<<1
    #define rs id<<1|1
    #define int long long
    using namespace std;
    
    const int N=1e5+10;
    int n,m,a[N];
    struct SegmentTree{
    	int l,r,sum,lazy;
    }tr[N<<2];
    
    void Push_up(int id)
    {
    	tr[id].sum=tr[ls].sum+tr[rs].sum;
    }
    
    void Push_down(int id)
    {
    	tr[ls].sum+=(tr[ls].r-tr[ls].l+1)*tr[id].lazy;
    	tr[rs].sum+=(tr[rs].r-tr[rs].l+1)*tr[id].lazy;
    	
    	tr[ls].lazy+=tr[id].lazy;
    	tr[rs].lazy+=tr[id].lazy;
    	
    	tr[id].lazy=0;
    }
    
    void Build(int id,int l,int r)
    {
    	tr[id].l=l;tr[id].r=r;tr[id].lazy=0;
    	if(l>=r)
    	{
    		tr[id].sum=a[l];
    		return;
    	}
    	int mid=(l+r)>>1;
    	Build(ls,l,mid);
    	Build(rs,mid+1,r);
    	Push_up(id);
    }
    
    void Add(int id,int l,int r,int k)
    {
    	if(tr[id].l>r || tr[id].r<l)return;
    	if(tr[id].l>=l && tr[id].r<=r)
    	{
    		tr[id].sum+=(tr[id].r-tr[id].l+1)*k;
    		tr[id].lazy+=k;
    		return;
    	}
    	Push_down(id);
    	Add(ls,l,r,k);
    	Add(rs,l,r,k);
    	Push_up(id);
    }
    
    int Calc(int id,int l,int r)
    {
    	if(tr[id].l>r || tr[id].r<l)return 0;
    	if(tr[id].l>=l && tr[id].r<=r)return tr[id].sum;
    	Push_down(id);
    	return Calc(ls,l,r)+Calc(rs,l,r);
    }
    
    signed main()
    {
    	scanf("%lld%lld",&n,&m);
    	for(int i=1;i<=n;++i)
    	{
    		scanf("%lld",&a[i]);
    	}
    	Build(1,1,n);
    	while(m--)
    	{
    		char opt;int a,b,c;
    		cin>>opt;
    		if(opt=='C')
    		{
    			scanf("%lld%lld%lld",&a,&b,&c);
    			Add(1,a,b,c);
    		}
    		else if(opt=='Q')
    		{
    			scanf("%lld%lld",&a,&b);
    			printf("%lld\n",Calc(1,a,b));
    		}
    	}
    	return 0;
    }
    
    

    信息

    ID
    154
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    78
    已通过
    13
    上传者