我瞎打的,但是本地测试RE
查看原帖
我瞎打的,但是本地测试RE
766675
da_ke楼主2024/4/19 23:02
#include <bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define pii pair<int,int>

using namespace std;
typedef long long ll;

const int N=1e5+23;

int n,Q;
ll a[N],sum[4*N],mi[4*N],tag[4*N];

inline void build(int l,int r,int p)
{
    int lc=p<<1,rc=p<<1|1,mid=l+(r-l)/2;
    if(l==r){
        sum[p]=a[l];
        mi[p]=a[l];
        return ;
    }
    build(l,mid,lc);
    build(mid+1,r,rc);
    sum[p]=sum[lc]+sum[rc];
    mi[p]=min(mi[lc],mi[rc]);
}

inline void push_down(int l,int r,int p)
{
    int lc=p<<1,rc=p<<1|1,mid=l+(r-l)/2;
    sum[lc]+=tag[p]*(mid-l+1);
    sum[rc]+=tag[p]*(r-mid);
    mi[lc]+=tag[p],mi[rc]+=tag[p];
    tag[lc]+=tag[p],tag[rc]+=tag[p];
    tag[p]=0;
}

inline void update(int s,int t,int l,int r,int v,int p)
{
    int lc=p<<1,rc=p<<1|1;
    if(s<=l&&r<=t)
    {
        sum[p]+=v*(r-l+1);
        mi[p]+=v,tag[p]+=v;
        return;
    }
    if(tag[p]) push_down(l,r,p);
    int mid=l+(r-l)/2;
    if(l<=mid) update(l,mid,s,t,v,lc);
    if(r>mid) update(s,t,mid+1,r,v,rc);
    sum[p]=sum[lc]+sum[rc];
    mi[p]=min(mi[lc],mi[rc]);
}

inline ll query_min(int s,int t,int l,int r,int p)
{
    int lc=p<<1,rc=p<<1|1;  
    if(s<=l&&r<=t) return mi[p];
    if(tag[p]) push_down(l,r,p);
    int mid=l+(r-l)/2;
    ll ans=1ll<<59;
    if(l<=mid) ans=min(ans,query_min(s,t,l,mid,lc));
    if(r>mid) ans=min(ans,query_min(s,t,mid+1,r,rc));
    return ans;
}

inline ll query_sum(int s,int t,int l,int r,int p)
{
    int lc=p<<1,rc=p<<1|1;  
    if(s<=l&&r<=t) return sum[p];
    if(tag[p]) push_down(l,r,p);
    int mid=l+(r-l)/2;
    ll ans=0;
    if(l<=mid) ans+=min(ans,query_min(s,t,l,mid,lc));
    if(r>mid) ans+=min(ans,query_min(s,t,mid+1,r,rc));
    return ans;
}

int main()
{
    cin>>n>>Q;
    rep(i,1,n)
        cin>>a[i];
    build(1,n,1);
    while(Q--)
    {
        char opt;
        cin>>opt;
        if(opt=='P'){
            int l,r,z;
            cin>>l>>r>>z;
            update(l,r,1,n,z,1);
        }
        if(opt=='M'){
            int l,r;cin>>l>>r;
            cout<<query_min(l,r,1,n,1)<<endl;
        }
        if(opt=='S'){
            int l,r;cin>>l>>r;
            cout<<query_sum(l,r,1,n,1)<<endl;
        }
    }
}

压了点行,不知道大家可习惯(

2024/4/19 23:02
加载中...