社区讨论

标记永久化不会写,15pts WA 求调

P3372【模板】线段树 1参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@miq41fht
此快照首次捕获于
2025/12/03 22:36
3 个月前
此快照最后确认于
2025/12/06 10:15
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long a[100005];
struct node
{
    long long data,lazy=0;
}tree[400060];
void pushup(int idx)
{
    tree[idx].data=tree[idx<<1].data+tree[idx<<1|1].data;
    return;
}
void build(int l,int r,int idx)
{
    if(l==r)
    {
        tree[idx].data=a[l];
        return;
    }
    int mid=l+((r-l)>>1);
    build(l,mid,idx<<1);
    build(mid+1,r,idx<<1|1);
    pushup(idx);
    return;
}
long long query(int L,int R,int l,int r,int idx,long long t)
{
    if(l>R||r<L) return 0;
    if(l>=L&&r<=R) return tree[idx].data+t*(r-l+1);
    int mid=l+((r-l)>>1);
    return query(L,R,l,mid,idx<<1,t+tree[idx].lazy)+query(L,R,mid+1,r,idx<<1|1,t+tree[idx].lazy);
}
void update(int L,int R,int l,int r,int idx,long long k)
{
    if(l>R||r<L) return;
    if(l>=L&&r<=R)
    {
        tree[idx].data+=k*(r-l+1),tree[idx].lazy+=k;
        return;
    }
    int mid=l+((r-l)>>1);
    update(L,R,l,mid,idx<<1,k);
    update(L,R,mid+1,r,idx<<1|1,k);
    pushup(idx);
    return;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
    for(int i=1,cz,x,y;i<=m;i++)
    {
        cin>>cz>>x>>y;
        if(cz==1)
        {
            long long k;
            cin>>k;
            update(x,y,1,n,1,k);
        }
        else cout<<query(x,y,1,n,1,0)<<endl;
    }
    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...