玄关求条40ptsWA

P3372 【模板】线段树 1

DYF2765491381672943 @ 2024-11-01 20:43:45

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int dp[1000050],lazy[1000050],a[100050],n,q;
void build(int s,int t,int p)
{
    if (s==t)
    {
        dp[p]=a[s];
        return;
    }
    int m=s+((t-s)>>1);
    build(s,m,p*2);build(m+1,t,p*2+1);
    dp[p]=dp[p*2]+dp[p*2+1];
    return;
}
int find(int l,int r,int s,int t,int p)
{

    if (s>=l&&t<=r)return dp[p];
    int tmp=0;
    int m=s+((t-s)>>1);
    if (lazy[p])
    {
        dp[p*2]+=lazy[p]*(m-s+1);
        dp[p*2+1]+=lazy[p]*(t-m);
        lazy[p*2]+=lazy[p];
        lazy[p*2+1]+=lazy[p];
        lazy[p]=0; 
    }
    if (m>=l)tmp+=find(l,r,s,m,p*2);
    if (m<r)tmp+=find(l,r,m+1,t,p*2+1);
    return tmp;
}
void add(int l,int r,int s,int t,int p,int k)
{
    if (l<=s&&t<=r)
    {
        dp[p]+=k*(t-s+1);lazy[p]+=k;
        return;
    }
    int m=s+((t-s)>>1);
    if (lazy[p]&&s!=t)
    {
        dp[p*2]+=lazy[p]*(m-s+1);
        dp[p*2+1]+=lazy[p]*(t-m);
        lazy[p*2]+=lazy[p];
        lazy[p*2+1]+=lazy[p];
        lazy[p]=0; 
    }
    if (m>=l){add(l,r,s,m,p*2,k);}
    if (m<r){add(l,r,m+1,t,p*2+1,k);}
    dp[p]=dp[p*2]+dp[p*2+1];
    return;
}
void test(int s,int t,int p)
{
    int m=s+((t-s)>>1);
    if (s!=t)
    {
        test(s,m,p*2);
        test(m+1,t,p*2+1);
    }
    return;
}
signed main()
{
    cin>>n>>q;
    for (int i=1;i<=n;i++)cin>>a[i];
    build(1,n,1);
    for (int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        if (x==1)
        {
            int l,r,k;
            cin>>l>>r>>k;
            add(l,r,1,n,1,k);
        }
        if (x==2)
        {
            int l,r;
            cin>>l>>r;
            cout<<find(l,r,1,n,1)<<endl;
        }
    }
    return 0;
}

by DYF2765491381672943 @ 2024-11-08 20:39:16

已AC,此贴结


|