代码求调
  • 板块学术版
  • 楼主封禁用户
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/10/1 19:19
  • 上次更新2023/10/27 09:19:22
查看原帖
代码求调
763815
封禁用户楼主2022/10/1 19:19

rt,为什么自己写的线段树 过不了样例

#include <bits/stdc++.h>
using namespace std;
#define maxn 10000010 
#define int long long 
int t[maxn<<2],a[maxn],tag[maxn<<2],n,m;
inline int left(int k){return k<<1;}
inline int right(int k){return k<<1|1;}
inline void push_up(int k){t[k]=t[left(k)]+t[right(k)];}// = k.size = k.left.size + k.right.size
inline void f(int p,int l,int r,int k){tag[p]+=k;t[p]+=k*(r-l+1);}
inline void push_down(int p,int l,int r){
    int mid=(l+r)>>1;
    f(left(p),l,mid,tag[p]);
    f(right(p),mid+1,r,tag[p]);
    tag[p]=0;
}
void build(int p,int l,int r){// make a tree
    tag[p]=0;
    if(l==r){
        t[p]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(left(p),l,mid);
    build(right(p),mid+1,r);
    push_up(p);
}
void update(int L,int R,int l,int r,int p,int k){//L,R 修改的区间 l,r p节点所代表区间 p 节点下标
    if(L<=r&&r<=R){
        f(p,l,r,k);
        return;
    }
    push_down(p,l,r);
    int mid=(l+r)>>1;
    if(L<=mid)update(L,R,l,mid,left(p),k);
    if(R>mid)update(L,R,mid+1,r,right(p),k);
    push_up(p);
}
int query(int L,int R,int l,int r,int p){
    push_down(p,l,r);
    if(L<=l&&r<=R)return t[p];
    int res=0,mid=(l+r)>>1;
    // push_down(p,l,r);
    if(L<=mid)res+=query(L,R,l,mid,left(p));
    if(R>mid)res+=query(L,R,mid+1,r,right(p));
    return res;
}
void scan(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
}
signed main(){
    int opt;
    int b,c,d,e,f;
    scan();
    build(1,1,n);
    while(m--){
        scanf("%lld",&opt);
        if(opt==1){
            scanf("%lld%lld%lld",&b,&c,&d);
            update(b,c,1,n,1,d);
        }else{
            scanf("%lld%lld",&e,&f);
            printf("%lld\n",query(e,f,1,n,1));
        }
    }
}

2022/10/1 19:19
加载中...