萌新刚学oi,调崩溃了,求助大佬
  • 板块P2357 守墓人
  • 楼主telesport
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/8/12 16:29
  • 上次更新2023/11/4 10:54:41
查看原帖
萌新刚学oi,调崩溃了,求助大佬
457208
telesport楼主2021/8/12 16:29

样例过了,提交全爆0,求助qaq

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll a[800005],sum[800005],add[800005],zhu=0,fzhu=0;
void build(ll k,ll l,ll r){
    if(l==r){
        sum[k]=a[l];
        return;
    }
    ll mid=(l+r)/2;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    sum[k]=sum[k*2]+sum[k*2+1];
}
void addsom(ll k,ll l,ll r,ll x,ll y,ll v){
    if(x<=l&&y>=r){
        add[k]+=v;
        return;
    }
    sum[k]+=(min(r,y)-max(l,x)+1)*v;
    ll mid=(l+r)/2;
    if(x<=mid) addsom(k*2,l,mid,x,y,v);
    if(mid<y) addsom(k*2+1,mid+1,r,x,y,v);
}
ll check(ll k,ll l,ll r,ll x,ll y){
    if(l>=x&&r<=y) return sum[k]+(r-l+1)*add[k];
    ll mid=(l+r)/2;
    ll ans=sum[k]+(min(r,y)-max(l,x)+1)*add[k];
    if(x<=mid) ans+=check(2*k,l,mid,x,y);
    if(mid<y) ans+=check(2*k+1,mid+1,r,x,y);
    return ans;
}
int main(){
    ll i,j,m,n,k,x,y,v;
    scanf("%lld%lld",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    } 
    build(1,1,n);
    while(m--){
        cin>>k;
        if(k==1){
            scanf("%lld%lld%lld",&x,&y,&v);
            if(x<=1) fzhu+=v;
            addsom(1,1,n,x,y,v);
        }
        if(k==2){
            scanf("%lld",&v);
            zhu+=v;
        }
        if(k==3){
            scanf("%lld",&v);
            zhu-=v;
        }
        if(k==4){
            scanf("%lld%lld",&x,&y);
            if(x<=1) printf("%lld\n",zhu+check(1,1,n,x,y));
            else printf("%lld\n",check(1,1,n,x,y));
        }
        if(k==5){
            printf("%lld\n",fzhu+zhu+a[1]);
        }
    }
    return 0;
}
2021/8/12 16:29
加载中...