MLE是什么意思?

P3391 【模板】文艺平衡树

rc_Taurus @ 2024-08-02 16:40:16

本人用的是FHQ-Treap,代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,rt,p,l,r;
struct FHQ{
    int l,r;
    int key,val;
    int siz,tag;
}tr[N];
void add(int x){
    tr[x].val=x;
    tr[x].siz=1;
    tr[x].key=rand();
    tr[x].l=tr[x].r=0;
}
void push_down(int p){
    if(tr[p].tag){
        swap(tr[p].l,tr[p].r);
        tr[tr[p].l].tag^=1;
        tr[tr[p].r].tag^=1;
        tr[p].tag=0;
    }
}
void push_up(int p){
    tr[p].siz=tr[tr[p].l].siz+tr[tr[p].r].siz+1;
}
void split(int p,int x,int &l,int &r){
    if(!p){
        l=r=0;
        return;
    }
    push_down(p);
    if(tr[tr[p].l].siz+1<=x){
        l=p;
        split(tr[p].r,x-tr[tr[p].l].siz-1,tr[p].r,r);
    }else{
        r=p;
        split(tr[p].l,x,l,tr[p].l);
    }
    push_up(p);
}
int merge(int l,int r){
    if(!l||!r){
        return l+r;
    }
    if(tr[l].key<tr[r].key){
        push_down(l);
        tr[l].r=merge(tr[l].r,r);
        push_up(l);
        return l;
    }else{
        push_down(r);
        tr[r].l=merge(l,tr[r].l);
        push_up(r);
        return r;
    }
}
void print(int u){
    push_down(u);
    if(tr[u].l)print(tr[u].l);
    cout<<tr[u].val<<' ';
    if(tr[u].r)print(tr[u].r);
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        add(i);
        rt=merge(rt,i);
    }
    while(m--){
        int x,y;
        cin>>x>>y;
        split(rt,y,l,r);
        split(rt,x-1,l,p);
        tr[p].tag^=1;
        rt=merge(merge(l,p),r);
    }
    print(rt);
    return 0;
}

提交记录

为什么会MLE啊啊啊啊啊啊啊啊?

悬两关,求条


by MysteriousEast @ 2024-08-02 16:42:34

@rc_Taurus 空间超限


by rc_Taurus @ 2024-08-02 16:44:51

@MysteriousEast 我说的是为什么会MLE,我当然知道空间超了:(


by ACcepted917 @ 2024-08-02 16:51:56

你可以参考我的代码:

#include<bits/stdc++.h>
using namespace std;
//P3391
const int N=1e6+10;
#define fup(l,r) for(int i=l;i<=r;i++)
//用静态数组来模拟树
int cnt,root;
std::mt19937 rnd(233);
struct node{
    int val,pri,ls,rs,size,lazy;
}t[N];
int newNode(int x){
    t[++cnt]={x,rnd(),0,0,1,0};//初始化一个新结点 
    return cnt;
}
void update(int u){
    t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}
//懒标记下移
void pushdown(int u){
    if(t[u].lazy){
        swap(t[u].ls,t[u].rs);
        t[t[u].ls].lazy ^= 1;
        t[t[u].rs].lazy ^= 1;
        t[u].lazy=0;//清空懒标记 
    }

} 
//排名分裂--按顺序分裂 
void Split(int u,int x,int& L,int& R){
    if(u==0){
        L=R=0;
        return;
    }
    pushdown(u); 
    if(t[t[u].ls].size+1<=x){
        L=u;
        Split(t[u].rs,x-(t[t[u].ls].size+1),t[u].rs,R);
    }
    else{
        R=u;
        Split(t[u].ls,x,L,t[u].ls);
    }
    update(u);
}
int Merge(int L,int R){
    if(L==0||R==0) return L+R;
    if(t[L].pri>t[R].pri){
        pushdown(L);
        t[L].rs=Merge(t[L].rs,R);
        update(L);
        return L;
    }
    else{
        pushdown(R);
        t[R].ls=Merge(L,t[R].ls);
        update(R);
        return R;
    }
}
//中序遍历
void inorder(int u){
    if(u==0) return ;
    pushdown(u);
    inorder(t[u].ls);
    printf("%d ",t[u].val);
    inorder(t[u].rs); 
}
int x,y,l,r,p;
int main(){
    int n,m;
    cin>>n>>m;
    fup(1,n){
        root=Merge(root,newNode(i));
    }
    while(m--){
        scanf("%d%d",&x,&y);
        Split(root,x-1,l,p);
        Split(p,y-x+1,p,r);
        t[p].lazy^=1;
        root=Merge(l,Merge(p,r));
    }
    inorder(root);
    return 0;
}

by ACcepted917 @ 2024-08-02 17:02:07

找到问题了!!!

main函数中的这两行:

split(rt,y,l,r);
split(rt,x-1,l,p);

应该为:

split(rt,x-1,l,p);
split(p,y-x+1,p,r);

by ACcepted917 @ 2024-08-02 17:03:45

改完是这样的:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,rt,p,l,r;
struct FHQ{
    int l,r;
    int key,val;
    int siz,tag;
}tr[N];
void add(int x){
    tr[x].val=x;
    tr[x].siz=1;
    tr[x].key=rand();
    tr[x].l=tr[x].r=0;
}
void push_down(int p){
    if(tr[p].tag){
        swap(tr[p].l,tr[p].r);
        tr[tr[p].l].tag^=1;
        tr[tr[p].r].tag^=1;
        tr[p].tag=0;
    }
}
void push_up(int p){
    tr[p].siz=tr[tr[p].l].siz+tr[tr[p].r].siz+1;
}
void split(int p,int x,int &l,int &r){
    if(!p){
        l=r=0;
        return;
    }
    push_down(p);
    if(tr[tr[p].l].siz+1<=x){
        l=p;
        split(tr[p].r,x-tr[tr[p].l].siz-1,tr[p].r,r);
    }else{
        r=p;
        split(tr[p].l,x,l,tr[p].l);
    }
    push_up(p);
}
int merge(int l,int r){
    if(!l||!r){
        return l+r;
    }
    if(tr[l].key<tr[r].key){
        push_down(l);
        tr[l].r=merge(tr[l].r,r);
        push_up(l);
        return l;
    }else{
        push_down(r);
        tr[r].l=merge(l,tr[r].l);
        push_up(r);
        return r;
    }
}
void print(int u){
    push_down(u);
    if(tr[u].l)print(tr[u].l);
    cout<<tr[u].val<<' ';
    if(tr[u].r)print(tr[u].r);
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        add(i);
        rt=merge(rt,i);
    }
    while(m--){
        int x,y;
        cin>>x>>y;
        split(rt,x-1,l,p);
        split(p,y-x+1,p,r);
        tr[p].tag^=1;
        rt=merge(merge(l,p),r);
    }
    print(rt);
    return 0;
}

by ACcepted917 @ 2024-08-02 17:04:21

@rc_Taurus


by rc_Taurus @ 2024-08-02 19:06:19

@ACcepted917 orzorz已关


|