求助 线段树 [梅开二度]
查看原帖
求助 线段树 [梅开二度]
398483
SuoNi楼主2022/8/10 11:49
#include <bits/stdc++.h> 
using namespace std;
using ll = long long;

struct Node {
    int l,r;
    int sum;
}tree[1000010];

int a[1000010];
int tag[1000010];
void push_down(int index) {
    if(tag[index]!=0) {
        tag[index<<1] += tag[index];
        tag[index<<1+1] += tag[index];
        
    
    tree[index<<1].sum +=  tag[index]*(tree[index<<1].r-tree[index<<1].l+1);
    tree[index<<1+1].sum +=   tag[index]*(tree[index<<1+1].r-tree[index<<1+1].l+1) ;
    tag[index] = 0;
    }
        
}

void build(int index, int left, int right) {
    tree[index].l = left;
    tree[index].r = right;
    if(left == right) {tree[index].sum = a[left];return;}
    build(index<<1, left, (left+right)/2);
    build(index<<1+1, (left+right)/2+1, right);
    tree[index].sum = tree[index<<1].sum + tree[index<<1+1].sum;
}

ll quire(int index, int left, int right) {

    if(tree[index].l>=left && tree[index].r<=right) {
        return tree[index].sum;
        } 
    //if(tree[index].r <left || tree[index].l>right) return 0;
    push_down(index);
    ll ans = 0;
    if(left<=tree[index<<1].r)
        ans += quire(index<<1, left, right);
    if(right>=tree[index<<1+1].l)
        ans += quire(index<<1+1,left,right);
    //tree[index].sum += tree[index<<1].sum + tree[index<<1+1].sum;
    return ans;
}


void update (int index, int left, int right, int k) {
        
    if(tree[index].l>=left && tree[index].r<=right){
        tree[index].sum += k*(tree[index].r-tree[index].l+1);
        tag[index] += k;
        return;
    }
    push_down(index);
    if(left<=tree[index<<1].r)update(index<<1, left,right,k);
    if(right>=tree[index<<1+1].l)update(index<<1+1,left,right,k);
    tree[index].sum = tree[index<<1].sum + tree[index<<1+1].sum;
}

void solve() {
    int n,q;cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(q--){
        int pd;cin>>pd;
        if(pd==1){
            int l,r,k;cin>>l>>r>>k;
            update(1,l,r,k);
        }else {
            int l,r;cin>>l>>r;
            cout<<quire(1,l,r)<<endl;
        }
    }
}
//

int main() {
    //ll T;cin>>T;
    ll T = 1;
    while(T--)solve();
    
    return 0;
}
2022/8/10 11:49
加载中...