萌新全部wa求调

P3372 【模板】线段树 1

hnoi @ 2023-10-18 23:38:36

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int const maxn=10e5+5;
int a[maxn],mi[4*maxn];
int lz[4*maxn];
inline ll ls(ll x){
    return x<<1;
}
inline ll rs(ll x){
    return x<<1|1;
}
inline void push_up(ll p)
{
    mi[p]=mi[ls(p)]+mi[rs(p)];
}
void build(ll p,ll l,ll r){
    lz[p]=0;
    if(l==r) {
        mi[p]=a[l];
        return ;
    }
    ll mid=(l+r)>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
}
//void change (int k,int l,int r,int x,int v){//单点修改(建树) 
//  if(x>r||x<l) return;
//  if(l==r&&l==x)
//  {
//      mi[k]+=v;
//      return;
//  }
//  int mid=(l+r)/2;
//  change(2*k,l,mid,x,v);
//  change(2*k+1,mid+1,r,x,v);
//  push_up(k);
//}
inline void f(ll p,ll l,ll r,ll k){
    lz[p]=lz[p]+k;
    mi[p]+=k*(r-l+1);
}
inline void push_down(ll p,ll l,ll r){
    ll mid=(l+r)>>1;
    f(ls(p),l,mid,lz[p]);
    f(rs(p),mid+1,r,lz[p]);
    lz[p]=0;
}
void update(int k,int l,int r,int x,int y,int t){//区间修改 
    //l,r为要修改的区间
    //x,y为当前节点存储的区间 
    if(l<=x&&y<=r){
        mi[k]+=(y-x+1)*t;
        lz[k]+=t;
        return;
    }
    push_down(k,x,y);
    int mid=(x+y)>>1;
    if(l<=mid) update(ls(k),l,r,x,mid,t);
    if(r>mid) update(rs(k),l,r,mid+1,y,t);
    push_up(k);
}
long long getsum (int k,int l,int r,int x,int y){//(区间查询-求和) 
    ll res=0;
    if(x<=l&&r<=y) return mi[k];
    int mid=(l+r)/2;
    push_down(k,l,r);
    if(x<=mid) res+=getsum(ls(k),l,mid,x,y);
    if(y>mid) res+=getsum(rs(k),mid+1,r,x,y);
    return res;
}

int main(){
    long long ans=0;
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
//      change(1,1,n,i,a[i]);
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int f,x,y;
        scanf("%d%d%d",&f,&x,&y);
        if(f==1){
            int k;
            scanf("%d",&k);
            update(1,1,n,x,y,k);
        }
        else{
            cout<<getsum(1,1,n,x,y)<<endl;
        }
    }
}

by Alexxtl @ 2023-10-18 23:51:59

update(1,1,n,x,y,k);

改成

update(1,x,y,1,n,k);

试试?


by hnoi @ 2023-10-20 15:48:39

@Alexxtl 试了一下 还是全wa()但是样例过了


|