求教哪里忘记push了
  • 板块P2710 数列
  • 楼主R_aier
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/17 10:12
  • 上次更新2023/11/17 12:59:30
查看原帖
求教哪里忘记push了
891245
R_aier楼主2023/11/17 10:12
#include<bits/stdc++.h>
#define AC return 0;
using namespace std;
const int maxn=5e5+1000;
int a[maxn],n,m;
mt19937 mt;
struct ODT
{
    struct node
    {
        int ls=0,rs=0,val=0,sum=0,lmax=0,rmax=0,max_sum=0,len=0,siz=0,pri=0;
        bool tag=0;
    }t[maxn];
    #define ls(u) t[u].ls
    #define rs(u) t[u].rs
    #define val(u) t[u].val
    #define sum(u) t[u].sum
    #define lm(u) t[u].lmax
    #define rm(u) t[u].rmax
    #define maxs(u) t[u].max_sum
    #define len(u) t[u].len
    #define siz(u) t[u].siz
    #define pri(u) t[u].pri
    #define tag(u) t[u].tag
    int rt,cnt,st[maxn],top;
    int new_node(int val,int len)
    {
        if(top)
        {
            int tmp=st[top--];
            if(ls(tmp)) st[++top]=ls(tmp);
            if(rs(tmp)) st[++top]=rs(tmp);
            t[tmp]={0,0,val,val,max(0,val),max(0,val),max(0,val),len,len,int(mt()),0};
            return tmp;
        }
        t[++cnt]={0,0,val,val,max(0,val),max(0,val),max(0,val),len,len,int(mt()),0};
        return cnt;
    }
    void addtag(int u)
    {
        if(!u) return;
        tag(u)^=1;
        swap(ls(u),rs(u));
        swap(lm(u),rm(u));
    }
    void push_up(int u)
    {
        lm(u)=max(max(0,lm(ls(u))),max(sum(ls(u))+len(u)*val(u),sum(ls(u))+len(u)*val(u)+lm(rs(u))));
        rm(u)=max(max(0,rm(rs(u))),max(sum(rs(u))+len(u)*val(u),sum(rs(u))+len(u)*val(u)+rm(ls(u))));
        maxs(u)=max(len(u)*val(u)+rm(ls(u))+lm(rs(u)),max(maxs(ls(u)),maxs(rs(u))));
        sum(u)=sum(ls(u))+sum(rs(u))+val(u)*len(u);
        siz(u)=siz(ls(u))+siz(rs(u))+len(u);
    }
    void push_down(int u)
    {
        if(tag(u))
        {
            addtag(ls(u));
            addtag(rs(u));
            tag(u)=0;
        }
    }
    int merge(int l,int r)
    {
        if(!l||!r) return l|r;
        if(pri(l)>pri(r))
        {
            push_down(l);
            rs(l)=merge(rs(l),r);
            push_up(l);
            return l;
        }
        else
        {
            push_down(r);
            ls(r)=merge(l,ls(r));
            push_up(r);
            return r;
        }
    }
    int split_node(int u,int siz)
    {
        push_down(u);
        int tmp=new_node(val(u),len(u)-siz);
        len(u)=siz;
        rs(tmp)=rs(u);
        rs(u)=0;
        push_up(u);
        push_up(tmp);
        return tmp;
    }
    void split(int u,int siz,int &l,int &r)
    {
        if(!u) return l=r=0,void();
        push_down(u);
        if(siz<siz(ls(u)))
        {
            r=u;
            split(ls(u),siz,l,ls(u));
        }
        else if(siz>siz(ls(u))+len(u))
        {
            l=u;
            split(rs(u),siz-siz(ls(u))-len(u),rs(u),r);
        }
        else
        {
            if(siz==siz(ls(u)))
            {
                l=ls(u);
                r=u;
                ls(u)=0;
            }
            else if(siz==siz(ls(u))+len(u))
            {
                l=u;
                r=rs(u);
                rs(u)=0;
            }
            else
            {
                l=u;
                r=split_node(u,siz-siz(ls(u)));
            }
        }
        push_up(u);
    }
    int build(int l,int r)
    {
        if(l>r)return 0;
        int mid=(l+r)>>1,u=new_node(a[mid],1);
        ls(u)=build(l,mid-1);
        rs(u)=build(mid+1,r);
        push_up(u);
        return u;
    }
    void insert(int pos,int tot)
    {
        int u=build(1,tot),l,r;
        split(rt,pos,l,r);
        rt=merge(l,merge(u,r));
    }
    void remove(int pos,int tot)
    {
        int l,r,p;
        split(rt,pos-1,l,p);
        split(p,tot,p,r);
        st[++top]=p;
        rt=merge(l,r);
    }
    void assign(int pos,int tot,int c)
    {
        int l,r,p;
        split(rt,pos-1,l,p);
        split(p,tot,p,r);
        st[++top]=p;
        rt=merge(l,merge(new_node(c,tot),r));
    }
    void reverse(int pos,int tot)
    {
        int l,r,p;
        split(rt,pos-1,l,p);
        split(p,tot,p,r);
        addtag(p);
        rt=merge(l,merge(p,r));
    }
    int query_sum(int pos,int tot)
    {
        int l,r,p,sum;
        split(rt,pos-1,l,p);
        split(p,tot,p,r);
        sum=sum(p);
        rt=merge(l,merge(p,r));
        return sum;
    }
    int query_max_sum()
    {
        return maxs(rt);
    }
    void dfs(int u)
    {
        if(!u) return;
        // push_down(u);
        // push_up(u);
        dfs(ls(u));
        // printf("%d %d\n",val(u),len(u));
        dfs(rs(u));
        push_up(u);
    }
    void out()
    {
        dfs(rt);
        // printf("\n");
    }
    void init()
    {
        rt=build(1,n);
    }
}t;

void solve()
{
    char opt[10];
    int pos,tot,c;
    while(m--)
    {
        scanf("%s",opt+1);
        if(opt[1]=='G')//GET-SUM 
        {
            scanf("%d%d",&pos,&tot);
            printf("%d\n",t.query_sum(pos,tot));
        }
        else if(opt[1]=='M')
        {
            if(opt[3]=='X')//MAX-SUM
            {
                t.out();
                printf("%d\n",t.query_max_sum());
            }
            else //MAKE-SAME
            {
                scanf("%d%d%d",&pos,&tot,&c);
                t.assign(pos,tot,c);
            }
        }
        else if(opt[1]=='I')//INSERT 
        {
            scanf("%d%d",&pos,&tot);
            for(int i=1;i<=n;++i) scanf("%d",a+i);
            t.insert(pos,tot);
        }
        else if(opt[1]=='R')//REVERSE
        {
            scanf("%d%d",&pos,&tot);
            t.reverse(pos,tot);
        }
        else //DELETE
        {
            scanf("%d%d",&pos,&tot);
            t.remove(pos,tot);
        }
        cout<<t.query_max_sum()<<" ";
        t.out();
        cout<<t.query_max_sum()<<endl;
    }
}
void init()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i) scanf("%d",a+i);
    t.init();
}
int main()
{
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
    init();
    solve();
    AC
}

2023/11/17 10:12
加载中...