P3372 WA10pts求调

P3372 【模板】线段树 1

zzzychita @ 2023-10-07 16:38:16

除了第一个点和样例能过,其他都过不了QwQ


#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=100001;
struct node{
    int l;
    int r;
    ll dat;
    ll tag;
}st[MAXN+1];
ll a[MAXN];
void build(int node_num,int l,int r)
{
    st[node_num].l=l;
    st[node_num].r=r;
    st[node_num].tag=0;
    if(l==r)
    {
        st[node_num].dat=a[l];
        return;
    }
    build(node_num*2,l,(l+r)/2);
    build(node_num*2+1,(l+r)/2+1,r);
    st[node_num].dat=st[node_num*2].dat+st[node_num*2+1].dat;
}
void push_down(int node_num)
{
    if(st[node_num].tag==0) return;
    int mid=(st[node_num].l+st[node_num].r)/2;
    st[2*node_num].dat+=st[node_num].tag*(mid-st[node_num].l+1);
    st[2*node_num].tag+=st[node_num].tag;
    st[2*node_num+1].dat+=st[node_num].tag*(mid-st[node_num].r-mid);
    st[2*node_num+1].tag+=st[node_num].tag;
    st[node_num].tag=0;
}
ll ask(int node_num,int tar_l,int tar_r)
{

    int mid=(st[node_num].l+st[node_num].r)/2;
    if(st[node_num].l>=tar_l&&st[node_num].r<=tar_r)
    {
        return st[node_num].dat;
    }
    push_down(node_num);
    ll res=0;
    if(mid>=tar_l)
        res+=ask(node_num*2,tar_l,tar_r);
    if(mid<tar_r)
        res+=ask(node_num*2+1,tar_l,tar_r);
    return res;
}
void add(int node_num,int tar_l,int tar_r,ll val)
{
    if(st[node_num].l>=tar_l&&st[node_num].r<=tar_r)
    {
        st[node_num].dat+=val*(st[node_num].r-st[node_num].l+1);
        st[node_num].tag+=val;
        return;
    }
    int mid=(st[node_num].l+st[node_num].r)/2;
    push_down(node_num);
    if(mid>=tar_l)
        add(node_num*2,tar_l,tar_r,val);
    if(mid<tar_r)
        add(node_num*2+1,tar_l,tar_r,val);
    st[node_num].dat=st[node_num*2].dat+st[node_num*2+1].dat;
}
int main()
{
    int m,n;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(1,1,n);
    while(m--)
    {
        ll x,y,k,a1;
        scanf("%d",&a1);
        if(a1==1)
        {
            scanf("%lld%lld%lld",&x,&y,&k);
            add(1,x,y,k);
        }
        else
        {
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",ask(1,x,y));
        }
    }
    return 0;
}

by Nobelium_255 @ 2023-10-07 16:49:16

pushdown更新右儿子的时候是不是忘记+1了


|