救救孩子吧 P3372 【模板】线段树 1
  • 板块学术版
  • 楼主LsmQwQ
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/8/29 21:22
  • 上次更新2023/10/27 13:09:51
查看原帖
救救孩子吧 P3372 【模板】线段树 1
539947
LsmQwQ楼主2022/8/29 21:22

这题刚开始按某站的视频打了一遍,运行错误,又按题解改了一下,还是运行错误,程序运行到输入完data数组不行了,找了快一个小时了!救救本蒟蒻吧QwQ

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100000+10, INF=0x3f3f3f3f;
struct node{
    ll l,r,lazy;
    ll ans;
}tree[5*N];
ll data[N];
ll n,m;
inline void buildtree(ll i,ll l,ll r){
    ll mid;
    tree[i].l=l;
    tree[i].r=r;
    if(l==r){
        tree[i].ans=data[l];
        return;
    }
    mid=(l+r)/2;
    buildtree(i*2,l,m);
    buildtree(i*2+1,m+1,r);
    tree[i].ans=tree[i*2].ans+tree[i*2+1].ans;
}
inline void pushdown(ll i){
    tree[i*2].lazy+=tree[i].lazy;   
    tree[i*2].ans+=tree[i].lazy*(tree[i*2].r-tree[i*2].l+1);
    tree[i*2+1].lazy+=tree[i].lazy;
    tree[i*2+1].ans+=tree[i].lazy*(tree[i*2+1].r-tree[i*2+1].l+1);
    tree[i].lazy=0;
}
inline void change(ll i,ll l,ll r,ll k){
    if(tree[i].l>r || tree[i].r<l) return;
    if(tree[i].r<=r&&tree[i].l>=l){
        tree[i].ans+=k*(tree[i].r-tree[i].l+1);
        tree[i].lazy+=k;
        return;
    }
    if(tree[i].lazy>0)pushdown(i);
    change(i*2,l,r,k);
    change(i*2+1,l,r,k);
    tree[i].ans=tree[i*2].ans+tree[i*2+1].ans;
}
inline int ask(ll i,ll l,ll r){
    if(tree[i].r<l||tree[i].l>r)return 0;
    if(tree[i].r<=r&&tree[i].l>=l){
        return tree[i].ans;
    }
    if(tree[i].lazy>0)pushdown(i);
    return ask(i*2,l,r)+ask(i*2+1,l,r);
}
int main(){ 
    cin>>n>>m;
    for(int i=1;i<=n;++i)cin>>data[i];
    buildtree(1,1,n);
    for(int i=1;i<=m;++i){
        int op;cin>>op;
        if(op==1){
            int x,y,k;cin>>x>>y>>k;
            change(1,x,y,k);
        }
        else{
            int x,y;cin>>x>>y;
            cout<<ask(1,x,y)<<endl;
        }
    }
    return 0;
}
2022/8/29 21:22
加载中...