帮忙看看大佬们

P3372 【模板】线段树 1

zyt__dp @ 2024-09-25 18:56:54

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e7+7;
int n,m,a[N],f[N];
void jianshu(int k,int l,int r)
{
    if(l==r){
        f[k]=a[l];
        return ;
    }
    int m=(l+r)/2;
    jianshu(k+k,l,m);
    jianshu(k+k+1,m+1,r);
    f[k]=f[k+k]+f[k+k+1];
}
void add1(int k,int l,int r,int x,int y,int p)
{
    //f[k]+=(r-l)*p;
    if(x<=l&&r<=y){
        f[k]+=(r-l+1)*p;
        return ;
    }
    {
        return ;
    }
    int m=(l+r)>>1;
    if(x<=m){
        add1(k+k,l,m,x,y,p);
    }
    if(y>m)add1(k+k+1,m+1,r,x,y,p);
    f[k]=f[k+k]+f[k<<1+1];
}
int ans(int k,int l,int r,int s,int t)
{
    if(l==s&&r==t)return f[k];
    int m=(l+r)/2;
    if(t<=m)
    {
        return ans(k+k,l,m,s,t);
    }
    else{
        if(s>m)return ans(k+k+1,m+1,r,s,t);
        else{
            return ans(k+k,l,m,s,m)+ans((k+k+1),m+1,r,m+1,t);
        }
    }
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    jianshu(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int t,x,y,k;cin>>t; 
        if(t==1)
        {
            cin>>x>>y>>k;
            add1(1,1,n,x,y,k);
        }
        else
        {
            cin>>x>>y;
            cout<<ans(1,1,n,x,y)<<endl;
        }
    }
}

wa了 求调


by Phoenix2010 @ 2024-09-25 19:48:14

建议重新学一下懒标记


|