线段树只过了 1/3/4 求助
查看原帖
线段树只过了 1/3/4 求助
324666
diqiuyi奶龙楼主2022/3/18 14:28
#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
    int l,r;
    ll sum,lazy,Min;
}t[800005];
int n,q,a[800005],l,r,x;
char opt;
inline int read(){
	int x=0;bool f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=0;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
	return f?x:-x;
}
void pushdown(int p){
    if(!t[p].lazy)
        return ;
    t[p<<1].lazy+=t[p].lazy; 
	t[p<<1|1].lazy+=t[p].lazy;	
	t[p<<1].Min+=t[p].lazy;
	t[p<<1|1].Min+=t[p].lazy;
	t[p<<1].sum+=(t[p<<1].r-t[p<<1].l+1)*t[p].lazy;
	t[p<<1|1].sum+=(t[p<<1|1].r-t[p<<1|1].l+1)*t[p].lazy;
    t[p].lazy=0;
}
void build(int p,int l,int r){
    t[p].l=l,t[p].r=r;
    if(l==r){
        t[p].sum=a[l],t[p].Min=a[l];
        return ;
    }
    int mid=l+r>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
    t[p].Min=min(t[p<<1].Min,t[p<<1|1].Min);
}
ll gsum(int p,int l,int r){
    if(t[p].l>=l&&t[p].r<=r)
        return t[p].sum;
    pushdown(p);
    int mid=t[p].l+t[p].r>>1;
    ll res=0;
    if(l<=mid)
        res+=gsum(p<<1,l,r);
    if(r>mid)
        res+=gsum(p<<1|1,l,r);
    return res;
}
ll gmin(int p,int l,int r){
    if(t[p].l>=l&&t[p].r<=r)
        return t[p].Min;
    pushdown(p);
    int mid=t[p].l+t[p].r>>1;
    ll res=0x7f7f7f7f;
    if(l<=mid)
        res=gmin(p<<1,l,r);
    if(r>mid)
        res=min(res,gmin(p<<1|1,l,r));
    return res;
}
void Add(int p,int l,int r,int x){
    if(t[p].l>=l&&t[p].r<=r){
        t[p].lazy+=x,t[p].Min+=x,t[p].sum+=(t[p].r-t[p].l+1)*x;
        return ;
    }
    pushdown(p);
    int mid=t[p].l+t[p].r>>1;
    if(l<=mid)
        Add(p<<1,l,r,x);
    if(r>mid)
        Add(p<<1|1,l,r,x);
    t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
    t[p].Min=min(t[p<<1].Min,t[p<<1|1].Min);
}
int main(){
    n=read(),q=read();
    for(int i=1;i<=n;i++)
        a[i]=read();
    build(1,1,n);
    while(q--){
        cin>>opt;
        l=read(),r=read();
        if(opt=='M')
            printf("%lld\n",gmin(1,l,r));
        if(opt=='S')
            printf("%lld\n",gsum(1,l,r));
        if(opt=='P'){
            x=read();
            Add(1,l,r,x);
        }
    }
    return 0;
}
2022/3/18 14:28
加载中...