样例过了0pts球跳玄关求求了
查看原帖
样例过了0pts球跳玄关求求了
1307045
Dark_Knight_AK_ALL楼主2025/8/4 15:51
#include<bits/stdc++.h>
using namespace std;
struct node{
    int maxn,minn,maxncnt,minncnt,sum,maxnh,minnf;
}w[4000001];
int opt,n,m,a[500001];
int lazya[500001],lazym[500001],lazys[500001],l,r,x;
int ls(int x){
    return x<<1;
}
int rs(int x)
{
    return x<<1|1;
}
void pushup(int x)
{
    w[x].sum=w[ls(x)].sum+w[rs(x)].sum;
    if(w[ls(x)].maxn==w[rs(x)].maxn)
    {
        w[x].maxn=w[ls(x)].maxn;
        w[x].maxncnt=w[ls(x)].maxncnt+w[rs(x)].maxncnt;
        w[x].maxnh=max(w[ls(x)].maxnh,w[rs(x)].maxnh);
    }
    else if(w[ls(x)].maxn>w[rs(x)].maxn)
    {
        w[x].maxn=w[ls(x)].maxn;
        w[x].maxncnt=w[ls(x)].maxncnt;
        w[x].maxnh=max(w[ls(x)].maxnh,w[rs(x)].maxn);
    }
    else {
        w[x].maxn=w[rs(x)].maxn;
        w[x].maxncnt=w[rs(x)].maxncnt;
        w[x].maxnh=max(w[ls(x)].maxn,w[rs(x)].maxnh);
    }
    if(w[ls(x)].minn==w[rs(x)].minn)
    {
        w[x].minncnt=w[ls(x)].minncnt+w[rs(x)].minncnt;
        w[x].minn=w[ls(x)].minn;
        w[x].minnf=min(w[ls(x)].minnf,w[rs(x)].minnf);
    }
    else if(w[ls(x)].minn<w[rs(x)].minn)
    {
        w[x].minn=w[ls(x)].minn;
        w[x].minncnt=w[ls(x)].minncnt;
        w[x].minnf=min(w[rs(x)].minn,w[ls(x)].minnf);
    }
    else {
        w[x].minn=w[rs(x)].minn;
        w[x].minncnt=w[rs(x)].minncnt;
        w[x].minnf=min(w[rs(x)].minnf,w[ls(x)].minn);
    }
}
void build(int l,int r,int x)
{
    if(l>r)return;
    if(l==r){
        w[x].sum=a[l];
        w[x].maxn=a[l];
        w[x].minn=a[l];
        w[x].maxncnt=1;
        w[x].minncnt=1;
        w[x].minnf=INT_MAX;
        w[x].maxnh=INT_MIN;
        lazym[x]=INT_MIN;
        lazys[x]=INT_MAX;
        lazya[x]=0;
        return;
    }
    int mid=l+r>>1;
    build(l,mid,ls(x));
    build(mid+1,r,rs(x));
    pushup(x);
}
void pushadd(int x,int l,int r,int k)
{
    w[x].sum+=(r-l+1)*k;
    lazya[x]+=k;
    w[x].maxn+=k;
    w[x].minn+=k;
    if(w[x].minnf!=INT_MAX)w[x].minnf+=k;
    if(w[x].maxnh!=INT_MIN)w[x].maxnh+=k;
    if(lazym[x]!=INT_MIN)lazym[x]+=k;
    if(lazys[x]!=INT_MAX)lazys[x]+=k;
}
void pushmin(int x,int l,int r,int k)
{
    if(w[x].minn>=k)return;
    w[x].sum+=(k-w[x].minn)*w[x].minncnt;
    if(w[x].maxnh==w[x].minn)
        w[x].maxnh=k;
    if(w[x].maxn==w[x].minn)
        w[x].maxn=k;
    if(lazys[x]<k)
        lazys[x]=k; 
    w[x].minn=k;
    lazym[x]=k;
}
void pushmax(int x,int l,int r,int k)
{
    if(w[x].maxn<=k)return;
    w[x].sum+=(k-w[x].maxn)*w[x].maxncnt;
    if(w[x].minnf==w[x].maxn)
        w[x].minnf=k;
    if(w[x].maxn==w[x].minn)
        w[x].minn=k;
    if(lazym[x]>k)
        lazym[x]=k;
    w[x].maxn=k;
    lazys[x]=k;
}
void pushdown(int l,int r,int x)
{
    int mid=l+r>>1;
    if(lazya[x])
    {
        pushadd(ls(x),l,mid,lazya[x]);
        pushadd(rs(x),mid+1,r,lazya[x]);
    }
    if(lazym[x]!=INT_MIN)
    {
        pushmax(ls(x),l,mid,lazym[x]);
        pushmax(rs(x),mid+1,r,lazym[x]);
    }
    if(lazys[x]!=INT_MAX)
    {
        pushmin(ls(x),l,mid,lazys[x]);
        pushmax(rs(x),mid+1,r,lazys[x]);
    }
    lazys[x]=INT_MAX;
    lazym[x]=INT_MIN;
    lazya[x]=0;
}
void updateadd(int l,int r,int x,int L,int R,int k)
{
    if(R<l||r<L)return;
    if(L<=l&&r<=R)
    {
        pushadd(x,l,r,k);
        return;
    }
    pushdown(l,r,x);
    int mid=l+r>>1;
    updateadd(l,mid,ls(x),L,R,k);
    updateadd(mid+1,r,rs(x),L,R,k);
    pushup(x);
}
void updatemin(int l,int r,int x,int L,int R,int k)
{
    if(R<l||r<L||w[x].minn>=k)return;
    if(L<=l&&r<=R&&w[x].minnf>k)
    {
        pushmin(x,l,r,k);
        return;
    }
    pushdown(l,r,x);
    int mid=l+r>>1;
    updatemin(l,mid,ls(x),L,R,k);
    updatemin(mid+1,r,rs(x),L,R,k);
    pushup(x);
}
void updatemax(int l,int r,int x,int L,int R,int k)
{
    if(R<l||r<L||w[x].maxn<=k)return;
    if(L<=l&&r<=R&&w[x].maxnh<k)
    {
        pushmax(x,l,r,k);
        return;
    }
    pushdown(l,r,x);
    int mid=l+r>>1;
    updatemax(l,mid,ls(x),L,R,k);
    updatemax(mid+1,r,rs(x),L,R,k);
    pushup(x);
}
int queryadd(int l,int r,int x,int L,int R)
{
    if(R<l||r<L)return 0;
    if(L<=l&&r<=R)
    {
        return w[x].sum;
    }
    pushdown(l,r,x);
    int mid=l+r>>1,ans=0;
    ans+=queryadd(l,mid,ls(x),L,R);
    ans+=queryadd(mid+1,r,rs(x),L,R);
    return ans;
}
int querymax(int l,int r,int x,int L,int R)
{
    if(R<l||r<L)return INT_MIN;
    if(L<=l&&r<=R)
    {
        return w[x].maxn;
    }
    pushdown(l,r,x);
    int mid=l+r>>1,ans=0;
    ans=max(ans,querymax(l,mid,ls(x),L,R));
    ans=max(ans,querymax(mid+1,r,rs(x),L,R));
    return ans;
}
int querymin(int l,int r,int x,int L,int R)
{
    if(R<l||r<L)return INT_MAX;
    if(L<=l&&r<=R)
    {
        return w[x].minn;
    }
    pushdown(l,r,x);
    int mid=l+r>>1,ans=0;
    ans=min(ans,querymin(l,mid,ls(x),L,R));
    ans=min(ans,querymin(mid+1,r,rs(x),L,R));
    return ans;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,n,1);
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>opt;
        if(opt==1)
        {
            cin>>l>>r>>x;
            updateadd(1,n,1,l,r,x);
        }
        if(opt==2)
        {
            cin>>l>>r>>x;
            updatemin(1,n,1,l,r,x);
        }
        if(opt==3)
        {
            cin>>l>>r>>x;
            updatemax(1,n,1,l,r,x);
        }
        if(opt==4)
        {
            cin>>l>>r;
            cout<<queryadd(1,n,1,l,r)<<endl;
        }
        if(opt==5)
        {
            cin>>l>>r;
            cout<<querymax(1,n,1,l,r)<<endl;
        }
        if(opt==6)
        {
            cin>>l>>r;
            cout<<querymin(1,n,1,l,r)<<endl;
        }
    }
}
//sum区间和 maxn区间最大值 maxcnt区间最大值个数 minn区间最小值 minncnt区间最小值个数 minnf区间次小值 maxnh区间次大值 lazym区间最大值标记 lazys区间最小值标记 lazya区间加标记

大佬求求了喵

2025/8/4 15:51
加载中...