0pts,玄关(只要提出建议的全都关注)
查看原帖
0pts,玄关(只要提出建议的全都关注)
1382038
linruicong_gegeji楼主2025/7/30 10:18

某只蒟蒻的记录
某个难倒蒟蒻的题目

#include<bits/stdc++.h>
#define left 2*x
#define right 2*x+1
using namespace std;
int n,q,a[200005],u,v,w;
char c;
struct str{
    int val1,val2,lazy1,lazy2;
    bool mak1;
}tree[200005];
inline void build(int x,int l,int r)
{
    tree[x].lazy1=0x7f7f7f7f;
    tree[x].lazy2=0;
    if(l==r)
    {
        tree[x].val1=tree[x].val2=a[x];
        return ;
    }
    int mid=(l+r)>>1;
    build(left,l,mid);
    build(right,mid+1,r);
    tree[x].val1=min(tree[left].val1,tree[right].val1);
    tree[x].val2=tree[left].val2+tree[right].val2;
}
inline void push_down1(int x,int l,int r)
{
    if(tree[x].mak1&&l!=r)
    {
        tree[left].val1=tree[x].lazy1;
        tree[left].lazy1=tree[x].lazy1;
        tree[left].mak1=true;
        tree[right].val1=tree[x].lazy1;
        tree[right].lazy1=tree[x].lazy1;
        tree[right].mak1=true;
        tree[x].val1=0x7f7f7f7f;
        tree[x].mak1=false;
    }
}
inline void push_down2(int x,int l,int r)
{
    if(tree[x].lazy2&&l!=r)
    {
        tree[left].val2=tree[x].lazy2;
        tree[left].lazy2=tree[x].lazy2;
        tree[right].val2=tree[x].lazy2;
        tree[right].lazy2=tree[x].lazy2;
        tree[x].lazy2=0;
    }
}
inline int ask1(int x,int l,int r,int ql,int qr)
{
    if(l<=ql&&r>=qr) return tree[x].val1;
    push_down1(x,l,r);
    int mid=(ql+qr)>>1;
    if(r<=mid) return ask1(left,l,mid,ql,qr);
    else if(l>mid) return ask1(right,mid+1,r,ql,qr);
    else 
    {
        int lmin=ask1(left,l,mid,ql,mid);
        int rmin=ask1(right,mid+1,r,mid+1,qr);
        return min(lmin,rmin);
    }
}
inline int ask2(int x,int l,int r,int ql,int qr)
{
    if(l<=ql&&qr<=r) return tree[x].val2;
    push_down2(x,l,r);
    int mid=(ql+qr)>>1;
    if(r<=mid) return ask2(left,l,mid,ql,qr);
    else if(l>mid) return ask2(right,mid+1,r,ql,qr);
    else 
    {
        int lsum=ask2(left,l,mid,ql,mid);
        int rsum=ask2(right,mid+1,r,mid+1,qr);
        return lsum+rsum;
    }
}
inline void change(int x,int l,int r,int ql,int qr,int k)
{
    if(l<=ql&&qr<=r)
    {
        tree[x].val1+=k;
        tree[x].lazy1+=k;
        tree[x].mak1=true;
        tree[x].val2+=k;
        tree[x].lazy2+=k;
        return ;
    }
    push_down1(x,l,r);
    push_down2(x,l,r);
    int mid=(ql+qr)>>1;
    if(l<=mid) change(left,l,mid,ql,qr,k);
    else if(r>mid) change(right,mid+1,r,ql,qr,k);
    tree[x].val1=min(tree[left].val1,tree[right].val1);
    tree[x].val2=tree[right].val2+tree[left].val2;
    return ;
}
int main()
{
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=q;i++)
    {
        cin>>c;
        if(c=='M')
        {
            scanf("%d%d",&u,&v);
            printf("%d\n",ask1(1,1,n,u,v));
        }
        else if(c=='S')
        {
            scanf("%d%d",&u,&v);
            printf("%d\n",ask2(1,1,n,u,v));
        }
        else
        {
            scanf("%d%d%d",&u,&v,&w);
            change(1,1,n,u,v,w);
        }
    }
    return 0;
}
2025/7/30 10:18
加载中...