RE+MLE 56pts求调

P6136 【模板】普通平衡树(数据加强版)

Mu_leaf @ 2023-05-08 19:59:31

普通版已过,但这道题RE+MLE。

记录。

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+5;
int n,m,ind,root,a,b,c,x; 
int last,ans;
struct node{
    int ls,rs,val,rnd,siz;
}tr[N];
void hbsiz(int x){
    int ls=tr[x].ls;
    int rs=tr[x].rs;
    tr[x].siz=tr[ls].siz+tr[rs].siz+1;
}
int nes(int val){
    tr[++ind].val=val;
    tr[ind].rnd=rand();
    tr[ind].siz=1;
    return ind;
}
void merge(int x,int y,int &a){
    if(!x || !y){a=x+y;return;}
    if(tr[x].rnd<tr[y].rnd){
        merge(tr[x].rs,y,tr[x].rs);
        a=x;hbsiz(x);
    }else{
        merge(x,tr[y].ls,tr[y].ls);
        a=y;hbsiz(y);
    }
}
void split_val(int x,int val,int &a,int &b){
    if(!x){a=b=0;return;}
    if(tr[x].val<=val){
        split_val(tr[x].rs,val,tr[x].rs,b);
        a=x;
    }else{
        split_val(tr[x].ls,val,a,tr[x].ls);
        b=x;
    }hbsiz(x);
}
int split_siz(int x,int pm){
    int ls=tr[x].ls;
    if(pm<=tr[ls].siz){
        return split_siz(ls,pm);
    }else if(pm==tr[ls].siz+1){
        return tr[x].val;
    }else{
        return split_siz(tr[x].rs,pm-tr[ls].siz-1);
    }
}
int main(){
//  freopen("P6136_1.in","r",stdin);
//  freopen("P6136_1.out","w",stdout);
    srand(time(0));
    cin >> n >> m;
//  cout << m << "\n";
    for(int i=1;i<=n;i++){
        cin >> x;
        split_val(root,x-1,a,b);
        merge(a,nes(x),a);
        merge(a,b,root);
    }
    int que,i=0;
    while(m--){
        cin >> que >> i;
        i=i^last;
        if(que==1){
            split_val(root,i-1,a,b);
            merge(a,nes(i),a);
            merge(a,b,root);
        }if(que==2){
            split_val(root,i-1,a,b);
            split_val(b,i,b,c);
            int ls=tr[b].ls,rs=tr[b].rs;
            merge(ls,rs,root);
            merge(a,root,root);
            merge(root,c,root);
        }if(que==3){
            split_val(root,i-1,a,b);
//          cout << tr[a].siz+1 << "\n";
            last=tr[a].siz+1;
            ans=ans^last;
            merge(a,b,root);

        }if(que==4){
//          cout << split_siz(root,i) << "\n";
            last=split_siz(root,i);
            ans^=last;
        }if(que==5){
            split_val(root,i-1,a,b);
//          cout << split_siz(a,tr[a].siz) << "\n";
            last=split_siz(a,tr[a].siz);
            ans^=last;
            merge(a,b,root);
        }if(que==6){
            split_val(root,i,a,b);
//          cout << split_siz(b,1) << "\n";
            last=split_siz(b,1);
            ans^=last;
            merge(a,b,root);
        }
    }cout << ans << "\n";
    return 0 ;
}

by Mu_leaf @ 2023-05-08 20:18:58

已经AC了,但我还是有以下几点不懂:

1.为什么开 7*10^5MLE,但为什么开到 10^6 就不会存在 MLE 的情况了?

2.为什么题目要求 n \leq 10^5 但数组的范围必须开到 2*10^6 才可以 AC呢?

求大佬解答,谢谢了。


by Boxxxxxx @ 2023-05-09 08:57:26

@Mu_leaf122 因为题目的1e5是数组,可是有1e6个操作,如果1e6个操作全是插入,那么一共就会有1e6+1e5个数字了


by Mu_leaf @ 2023-05-09 22:21:25

@Boxxxxxx 感谢大佬解答


|