求调,哪里出问题了(快疯了)

P3372 【模板】线段树 1

H_LH @ 2024-09-03 20:16:36

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
ll a[N];
ll tree[N<<2];
ll tag[N<<2];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
void push_up(ll p){
    tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(ll p,ll pl,ll pr){
    tag[p]=0;
    if(pl==pr){tree[p]=a[pl];return;}
    ll mid=(pl+pr)>>1;
    build(ls(p),pl,mid);
    build(rs(p),mid+1,pr);
    push_up(p);
}
void addtag(ll p,ll pl,ll pr,ll d){
    tag[p]+=d;
    tree[p]+=d*(pr-pl+1);
}
void push_down(ll p,ll pl,ll pr){
    if(tag[p]){
        ll mid=(pl+pr)>>1;
        addtag(ls(p),pl,mid,tag[p]);
        addtag(rs(p),mid+1,pr,tag[p]);
        tag[p]=0;
    }
}
void update(ll L,ll R,ll p,ll pl,ll pr,ll d){
    if(L<=pl&&pr<=R){ 
        addtag(p,pl,pr,d);
        return;
    }
    push_down(p,pl,pr);
    ll mid=(pl+pr)>>1;
    if(L<=mid)update(L,R,ls(p),pl,mid,d);
    if(R>mid)update(L,R,rs(p),mid+1,pr,d);
    push_up(p);
}
ll query(ll L,ll R,ll p,ll pl,ll pr){
    if(pl>=L&&R>=pr)return tree[p];
    push_down(p,pl,pr);
    ll res=0;
    ll mid=(pl+pr)>>1;
    if(L<=mid)res+=query(L,R,ls(p),pl,mid);
    if(R>mid)res+=query(L,R,rs(p),mid+1,pr);
    return res;
}
int main(){
    ll n,m;
    cin>>n>>m;
    for(ll i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(n--){
        ll q,L,R,d;
        cin>>q;
        if(q==1){
            cin>>L>>R>>d;
            update(L,R,1,1,n,d);
        }
        else{
            cin>>L>>R;
            cout<<query(L,R,1,1,n)<<endl; 
        }
    }
    return 0;
}

by kemingyu @ 2024-09-03 20:22:06

#include<bits/stdc++.h>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
using namespace std;
long long a[100010],w[400010],l[400010];
void pushup(int u)
{
    w[u]=w[u*2]+w[u*2+1];
}
void build(int u,int L,int R)
{
    if(L==R)
    {
        w[u]=a[L];
        return ;
    }
    int M=(L+R)/2;
    build(u*2,L,M);
    build(u*2+1,M+1,R);
    pushup(u);
}
bool In(int L,int R,int l,int r)
{
    return (l<=L)&&(r>=R);
}
bool Out(int L,int R,int l,int r)
{
    return (L>r)||(l>R);
}
void mt(int u,int len,long long x)
{
    l[u]+=x;
    w[u]+=len*x;
}
void pd(int u,int L,int R)
{
    int M=(L+R)/2;
    mt(u*2,M-L+1,l[u]);
    mt(u*2+1,R-M,l[u]);
    l[u]=0;
}
void up(int u,int L,int R,int l,int r,long long x)
{
    if(In(L,R,l,r))
    {
        mt(u,R-L+1,x);
    }
    else if(!Out(L,R,l,r))
    {
        int M=(L+R)/2;
        pd(u,L,R);
        up(u*2,L,M,l,r,x);
        up(u*2+1,M+1,R,l,r,x);
        pushup(u);
    }
}
long long q(int u,int L,int R,int l,int r)
{
    if(In(L,R,l,r))
    {
        return w[u];
    }
    else if(!Out(L,R,l,r))
    {
        int M=(L+R)/2;
        pd(u,L,R);
        return q(u*2,L,M,l,r)+q(u*2+1,M+1,R,l,r);
    }
    else
    {
        return 0;
    }
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }   
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int op,x,y; 
        long long k;
        cin>>op;
        if(op==1)
        {
            cin>>x>>y>>k;
            up(1,1,n,x,y,k);
        }
        if(op==2)
        {
            cin>>x>>y;
            cout<<q(1,1,n,x,y)<<endl;
        }
    }
    return 0;
}
/*
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
*/

by SuperAlex4 @ 2024-09-03 20:43:54

你比下面那位更神秘

58 行 while(m--)


by int_stl @ 2024-09-09 21:10:49

@HuangLiHeng 省流:换成 while(m--) 就过了


|