我就想知道了,这怎么就MLE了
查看原帖
我就想知道了,这怎么就MLE了
377760
Reunite楼主2022/2/12 00:09
#include <cstdio>
#define ll long long
using namespace std;

int n,m;
int op,q,w,k,d;
ll a[100005];
ll b[100005];
ll sum[400005],add[400005];

inline void pushup(int u){
    sum[u]=sum[u<<1]+sum[u<<1|1];
}

void build(int u,int l,int r){
    if(l==r){
        sum[l]=b[l];
        return ;
    }
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}

inline void pushdown(int u,int l,int r){
    if(l==r||add[u]==0) return ;
    int mid=l+r>>1;
    sum[u<<1]+=add[u]*(mid-l+1);
    sum[u<<1|1]+=add[u]*(r-mid);
    add[u<<1]+=add[u],add[u<<1|1]+=add[u];
    add[u]=0;
    return ;
}

void updata(int u,int l,int r,int d,int L,int R){
    if(L<=l&&r<=R){
        sum[u]+=1ll*d*(r-l+1);
        add[u]+=1ll*d;
        return ;
    }
    pushdown(u,l,r);
    int mid=l+r>>1;
    if(L<=mid) updata(u<<1,l,mid,d,L,R);
    if(R>mid) updata(u<<1|1,mid+1,r,d,L,R);
    pushup(u);
}

ll query(int u,int l,int r,int L,int R){
    if(L<=l&&r<=R) return sum[u];
    pushdown(u,l,r);
    int mid=l+r>>1;
    ll ans=0;
    if(L<=mid) ans+=query(u<<1,l,mid,L,R);
    if(R>mid) ans+=query(u<<1|1,mid+1,r,L,R);
    return ans;
}

int main(){
    freopen("cnt.in","r",stdin);
    freopen("cnt.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i]-a[i-1];
    build(1,1,n);
    while(m--){
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d%d%d",&q,&w,&k,&d);
            updata(1,1,n,k,q,q);
            if(q+1<=w) updata(1,1,n,d,q+1,w);
            if(q<n) updata(1,1,n,-(k+d*(w-q)),w+1,w+1);

        }
        else{
            scanf("%d",&q);
            printf("%lld\n",query(1,1,n,1,q));
        }
    }

    return 0;
}

手算才开8MB内存啊...

2022/2/12 00:09
加载中...