70分求调 #8#9#10WA

P3372 【模板】线段树 1

Dansey @ 2024-02-20 15:13:57

#include<bits/stdc++.h>
using namespace std;
const int N=5000010;
int n,m,a[N],sum[N*4],tag[N*4]; 
/*
    堆式储存: 左儿子rt*2,右儿子rt*2+1 
    rt: 当前的根节点
    [l, r]: 当前根节点维护的区间 
*/
void build(int rt, int l, int r){
    if(l == r) {
        sum[rt] = a[l];
        return;
    }else{// 迭代
        int mid=(l+r)/2;
        build(rt*2,l,mid); // 左
        build(rt*2+1,mid+1,r); // 右
        sum[rt]=sum[rt*2]+sum[rt*2+1];
    }

}
void pushdown(int rt,int l,int r){
    tag[rt*2]+=tag[rt];
    tag[rt*2+1]+=tag[rt];
    int mid=(l+r)/2;     
    sum[rt*2]+= tag[rt]*(mid-l+1);
    sum[rt*2+1]+=tag[rt]*(r-mid);
    tag[rt]=0;  // 清空tag 
}
/*
    [x, y]: 询问区间 
*/
unsigned long long query(int rt,int l,int r,int x,int y){
    if(x<=l && r<=  y) return sum[rt];  // 包含 
    if(r<x || l > y) return 0; // 交集为空 
    pushdown(rt,l,r);
    int mid=(l+r)/2;
    unsigned long long result=0;
    result+=query(rt*2,l,mid,x,y); // 左
    result+=query(rt*2+1, mid + 1, r, x, y); // 右
    return result;
}
/*
    a[x, y] += v
*/
void modify(int rt,int l,int r,int x,int y,int v){
    if(x<=l && r<=y) { // 包含 
        tag[rt]+=v;  // 打标记 
        sum[rt]+=v*(r-l+1);                         
        return;
    }
    if(r<x || l>y) return; // 交集为空 
    pushdown(rt,l,r);
    int mid=(l+r)/2;
    modify(rt*2,l,mid,x,y,v); // 左
    modify(rt*2+1,mid+1,r,x,y,v);
    sum[rt]=sum[rt*2]+sum[rt*2+1];
    return;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int a,x,y,k;
        scanf("%d",&a);
        if(a==1){
            scanf("%d%d%d",&x,&y,&k);
            modify(1,1,n,x,y,k);
        }else{
            scanf("%d%d",&x,&y);
            unsigned long long ans=query(1,1,n,x,y);
            printf("%u\n",ans);
        }
    }
    return 0;
}

困住好久了:(


by Liyuqiao11 @ 2024-02-20 15:44:23

你用#define int long long就过了,就是全局开longlong


by Dansey @ 2024-02-20 16:21:24

已A 此帖结

谢谢: )


|