4.2KB 大号FHQ Treap 求调
查看原帖
4.2KB 大号FHQ Treap 求调
841638
Igunareo楼主2025/6/26 20:40

RT,不太调得动这棵FHQ Treap 不知道哪错了,反正0pts没过样例,有实力的大佬可以帮忙捞一下

#include<bits/stdc++.h>
using namespace std;
struct Ty{int ls,rs,cmp,siz,val,tag1,tag2,ans,summ,ansl,ansr;}y[550005];
int Q[550005],cnt=1,root=0;
void pushup(Ty &u){
    u.siz=y[u.ls].siz+y[u.rs].siz+1;
    u.summ=y[u.ls].val+y[u.rs].val+u.val;
    u.ansl=max(y[u.ls].ansl,y[u.rs].ansl+y[u.ls].summ);
    u.ansr=max(y[u.rs].ansr,y[u.ls].ansr+y[u.rs].summ);
    u.ans=max(y[u.ls].ansr+y[u.rs].ansl,max(y[u.ls].ans,y[u.rs].ans));
    return;
}
void pushdown(Ty &u){
    if(u.tag1<=1000){
        y[u.ls].val=u.tag1;
        y[u.rs].val=u.tag1;
        y[u.ls].tag1=u.tag1;
        y[u.rs].tag1=u.tag1;
        y[u.ls].summ=u.tag1*y[u.ls].siz;
        y[u.rs].summ=u.tag1*y[u.rs].siz;
        if(u.tag1>0){
            y[u.ls].ans=y[u.ls].ansl=y[u.ls].ansr=y[u.ls].summ;
            y[u.rs].ans=y[u.rs].ansl=y[u.rs].ansr=y[u.rs].summ;
        }
        else{
            y[u.ls].ans=y[u.ls].ansl=y[u.ls].ansr=0;
            y[u.rs].ans=y[u.rs].ansl=y[u.rs].ansr=0;
        }
        u.tag1=1001;
    }
    if(u.tag2){
        swap(y[u.ls].ls,y[u.ls].rs);
        swap(y[u.rs].ls,y[u.rs].rs);
        y[u.ls].tag2^=1;
        y[u.rs].tag2^=1;
        pushup(y[u.ls]);
        pushup(y[u.rs]);
        u.tag2=0;
    }
}
int node(int val){
    y[Q[cnt]].tag2=y[Q[cnt]].ls=y[Q[cnt]].rs=0;
    y[Q[cnt]].cmp=rand();
    y[Q[cnt]].val=y[Q[cnt]].summ=val;
    y[Q[cnt]].siz=1;
    y[Q[cnt]].tag1=1001;
    if(val>0)y[Q[cnt]].ansl=y[Q[cnt]].ansr=y[Q[cnt]].ans=val;
    else y[Q[cnt]].ansl=y[Q[cnt]].ansr=y[Q[cnt]].ans=0;
    cnt++;
    return Q[cnt-1];
}
void broke(int u,int val,int &a,int &b){
    if(!u){
        a=b=0;
        return;
    }
    pushdown(y[u]);
    if(y[y[u].ls].siz>=val)broke(y[u].ls,val,a,y[b=u].ls);
    else broke(y[u].rs,val-y[y[u].ls].siz,y[a=u].rs,b);
    pushup(y[u]);
    return;
}
int mixed(int a,int b){
    if(!a||!b)return a+b;
    pushdown(y[a]);
    pushdown(y[b]);
    if(y[a].cmp>y[b].cmp){
        y[a].rs=mixed(y[a].rs,b);
        pushup(y[a]);
        return a;
    }
    else{
        y[b].ls=mixed(a,y[b].ls);
        pushup(y[b]);
        return b;
    }
}
void insert(int id,int val){
    int a,b;
    broke(root,id,a,b);
    root=mixed(mixed(a,node(val)),b);
    return;
}
int query(int l,int r){
    int a,b,c;
    broke(root,l-1,a,b);
    broke(b,r-l+1,b,c);
    int ans=y[b].summ;
    root=mixed(mixed(a,b),c);
    return ans;
}
void recycle(int b){
    if(!b)return;
    Q[--cnt]=b;
    recycle(y[b].ls);
    recycle(y[b].rs);
    return;
}
void del(int l,int r){
    int a,b,c;
    broke(root,l-1,a,b);
    broke(b,r-l+1,b,c);
    recycle(b);
    root=mixed(a,c);
    return;
}
void update1(int l,int r,int val){
    int a,b,c;
    broke(root,l-1,a,b);
    broke(b,r-l+1,b,c);
    y[b].val=val;
    y[b].tag1=val;
    y[b].summ=val*y[b].siz;
    if(val>0)y[b].ans=y[b].ansl=y[b].ansr=y[b].summ;
    else y[b].ans=y[b].ansl=y[b].ansr=0;
    root=mixed(mixed(a,b),c);
    return;
}
void update2(int l,int r){
    int a,b,c;
    broke(root,l-1,a,b);
    broke(b,r-l+1,b,c);
    swap(y[b].ls,y[b].rs);
    y[b].tag2^=1;
    pushup(y[b]);
    root=mixed(mixed(a,b),c);
    return;
}
signed main(){
    for(int i=1;i<=550000;i++)Q[i]=i;
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        int a;
        scanf("%d",&a);
        insert(1,a);
    }
    for(int i=1;i<=m;i++){
        string s;
        cin>>s;
        if(s=="INSERT"){
            int add,l;
            scanf("%d%d",&l,&add);
            for(int j=1;j<=add;j++){
                int a;
                scanf("%d",&a);
                insert(l,a);
                l++;
            }
        }
        if(s=="DELETE"){
            int l,r;
            scanf("%d%d",&l,&r);
            del(l,l+r-1);
        }
        if(s=="MAKE-SAME"){
            int l,r,val;
            scanf("%d%d%d",&l,&r,&val);
            update1(l,l+r-1,val);
        }
        if(s=="REVERSE"){
            int l,r;
            scanf("%d%d",&l,&r);
            update2(l,l+r-1);
        }
        if(s=="GET-SUM"){
            int l,r;
            scanf("%d%d",&l,&r);
            printf("%d\n",query(l,l+r-1));
        }
        if(s=="MAX-SUM")printf("%d\n",y[root].ans);
    }
    return 0;
}
2025/6/26 20:40
加载中...