线段树0pts,样例运行不出
查看原帖
线段树0pts,样例运行不出
1015796
Lingyu_fly楼主2024/10/22 18:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,q,w;
int a[N];
struct tr{
    int l,r,sum,lazy;
}tree[N*4];
void pushup(int u){
    tree[u].sum=tree[u<<1].sum+tree[u<<1|1].sum;
}
void build(int u,int l,int r){
    tree[u]={l,r,0};
    if(l==r){
        tree[u].sum=a[l];
        return ;
    }
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}
void pushdown(int u){
    if(tree[u].lazy){
        tree[u<<1].sum+=(tree[u<<1].r-tree[u<<1].l+1)*tree[u].lazy;
        tree[u<<1|1].sum+=(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].lazy;
        tree[u<<1].lazy+=tree[u].lazy;
        tree[u<<1|1].lazy+=tree[u].lazy;
        tree[u].lazy=0;
    }
    return ;
}
void modify(int u,int l,int r,int d){
    if(l<=tree[u].l&&tree[u].r<=r){
        tree[u].sum+=(tree[u].r-tree[u].l+1)*d;
        tree[u].lazy+=d;
        return ;
    }
    pushdown(u);
    int mid=tree[u].l+tree[u].r>>1;
    if(l<=mid) modify(u<<1,l,r,d);
    if(mid<r) modify(u<<1|1,l,r,d);
    pushup(u);
}
int query(int u,int l,int r){
    if(l<=tree[u].l&&tree[u].r<=r){
        return tree[u].sum;
    }
    pushdown(u);
    int mid=tree[u].l+tree[u].r>>1;
    int ans=0;
    if(l<=mid) ans+=query(u<<1,l,r);
    if(mid<r) ans+=query(u<<1|1,l,r);
    return ans;
}
signed main(){
    scanf("%lld%lld%lld",&n,&q,&w);
    for(int i=1;i<=n;i++){
        scanf("%lld",a+i);
    }
    build(1,1,n);
    while(q--){
        int l,r,d;
        scanf("%lld%lld%lld",&l,&r,&d);
        modify(1,l,r,d);
        int t=w,sum=query(1,1,n),ans=0,ti=1;
        while(1){
            if(t-(sum*ti)<0){
                l=1;r=n;
                while(l<r){
                    int mid=l+r>>1;
                    if(query(1,1,mid)*ti>t) r=mid-1;
                    else l=mid;
                }
                ans=ans+l-1;
                break;
            }else if(t-(sum*ti)==0){
                ans=ans+n-1;
                break;
            }
            t=t-sum*ti;
            ans+=n;
            ti++;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
2024/10/22 18:16
加载中...