玄关线段树
  • 板块灌水区
  • 楼主wangziwenhk
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/28 15:34
  • 上次更新2024/3/28 15:53:32
查看原帖
玄关线段树
727556
wangziwenhk楼主2024/3/28 15:34
#include <bits/stdc++.h>
#define p2 (p<<1)
#define p3 ((p<<1)+1)
using namespace std;
const int MAXN = 1e5;
int n,m;
int tree[4*MAXN];
int lazy[4*MAXN];
int a[MAXN];
void push_down(int l,int r,int p){
    int mid = (l+r)>>1;
    tree[p2] += (mid-l+1)*lazy[p];
    tree[p3] += (r-mid)*lazy[p];
    lazy[p2] += lazy[p];
    lazy[p3] += lazy[p];
    lazy[p] = 0;
}
void push_up(int p){
    tree[p] = tree[p2]+tree[p3];
}
int question(int l,int r,int li,int re,int p){
    if(l<=li && re<=r)return tree[p];
    push_down(li,re,p);
    int mid = (li+re)>>1,sum=0;
    if(l<=mid)sum+= question(l,r,li,mid,p2);
    if(r>mid)sum+= question(l,r,mid+1,re,p3);
    return sum;
}
void update(int l, int r, int value, int li, int re, int p){
    if(l<=li && re<=r){
        tree[l]+=value*(re-li+1);
        lazy[p]+=value;
        return;
    }
    push_down(li,re,p);
    int mid = (li+re)>>1;
    if(l<=mid)update(l,r,value,li,mid,p2);
    if(r>mid)update(l,r,value,mid+1,re,p3);
    push_up(p);
}
void build(int l,int r,int p){
    if(l==r){
        tree[p] = a[l];
        return;
    }
    int mid = (l+r)>>1;
    build(l,mid,p2);
    build(mid+1,r,p3);
    push_up(p);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(1,n,1);
    while(m--){
        int op;
        scanf("%d",&op);
        if(op==1){
            int l,r,value;
            scanf("%d%d%d",&l,&r,&value);
            update(l,r,value,1,n,1);
        }
        if(op==2){
            int l,r;
            scanf("%d%d",&l,&r);
            printf("%d\n", question(l,r,1,n,1));
        }
    }
}

线段树1 我懒惰标记打错了吗

2024/3/28 15:34
加载中...