线段树样例都过不了求调/kk

P3372 【模板】线段树 1

Cynun @ 2022-11-04 20:50:10

#include<iostream>
#define MAXN 114514
#define ll long long
using namespace std;
ll a[MAXN],st[MAXN*4],tag[MAXN*4];
inline int lc(int x){return x<<1;}
inline int rc(int x){return x<<1|1;}

void pushup(int p){st[p]=st[lc(p)]+st[rc(p)];}
void build(ll l,ll r,ll p){
    if(l==r)st[p]=a[l];return;
    int m=(l+r)>>1;
    build(l,m,p*2);build(m+1,r,p*2+1);
    pushup(p);
}
void f(ll p,ll l,ll r,ll k){//quick moditfy
    tag[p]+=k;
    st[p]+=k*(r-l-1);
}
void pushdown(ll p,ll l,ll r){
    ll m=(l+r)>>1;
    f(p*2,l,m,tag[p]);
    f(p*2+1,m+1,r,tag[p]);
    tag[p]=0;
}
void upd(ll ml,ll mr,ll l,ll r,ll p,ll k){
    if(ml<=l&&r<=mr)f(p,l,r,k);
    pushdown(p,l,r);
    ll m=(l+r)>>1;
    if(ml<=m)upd(ml,mr,l,m,p*2,k);
    if(mr>m)upd(ml,mr,m+1,r,p*2+1,k);
}
ll qry(ll qx,ll qy,ll l,ll r,ll p){
    ll res=0;
    if(qx<=l&&r<=qy)return st[p];
    ll m=(l+r)>>1;
    pushdown(p,l,r);
    if(qx<=m)res+=qry(qx,qy,l,m,p*2);
    if(qy>m)res+=qry(qx,qy,m+1,r,p*2+1);
    return res;
}
int main(void){
    ll a1,b,c,d,e,f,n,m;
    cin>>n>>m;
    for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
    build(1,1,n);
    while(m--){
        scanf("%lld",&a1);
        switch(a1){
            case 1:{
                scanf("%lld%lld%lld",&b,&c,&d);
                upd(b,c,1,n,1,d);
                break;
            }
            case 2:{
                scanf("%lld%lld",&e,&f);
                printf("%lld\n",qry(e,f,1,n,1));
                break;
            }
        }
    }
    return 0;
}

蒟蒻学线段树断断续续有1个月了,还是写不对/kk


by HBWH_zzz @ 2022-11-04 20:53:58

update 函数要在最后 pushup 以下


by HBWH_zzz @ 2022-11-04 20:54:01

@Cynun


by HBWH_zzz @ 2022-11-04 20:54:22

以下->一下


by HBWH_zzz @ 2022-11-04 20:59:17

build 传参传错了


by HBWH_zzz @ 2022-11-04 20:59:27

@Cynun


by HBWH_zzz @ 2022-11-04 21:02:28

build 函数 if(l==r)st[p]=a[l];return; 有锅,要打括号


by HBWH_zzz @ 2022-11-04 21:04:11

upd 里要

if(ml<=l&&r<=mr){
    f(p,l,r,k);
    return;
}

也要 return; !!!


by HBWH_zzz @ 2022-11-04 21:05:34

void f(ll p,ll l,ll r,ll k){//quick moditfy
    tag[p]+=k;
    st[p]+=k*(r-l+1);
}

那里是 r-l+1 (长度是 r-l+1 )啊!


by HBWH_zzz @ 2022-11-04 21:06:44

交了一发,过了。就这些问题,就不发完整代码了(要是要的话私信,我可能明天回


by HBWH_zzz @ 2022-11-04 21:07:12

@Cynun


| 下一页