社区讨论

关于 MLE

P11266【模板】可并堆 2参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjrcppm
此快照首次捕获于
2025/11/04 07:15
4 个月前
此快照最后确认于
2025/11/04 07:15
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
int T, n, opt, x, y, root[1000010], ls[1000010], rs[1000010], fa[1000010], dis[1000010];
long long z, a[1000010];
int merge(int x, int y){
    if(!x || !y) return (x | y);
    if(a[x] > a[y]) std::swap(x, y);
    rs[x] = merge(rs[x], y);
    if(dis[ls[x]] < dis[rs[x]]) std::swap(ls[x], rs[x]);
    dis[x] = dis[rs[x]] + 1;
    fa[ls[x]] = fa[rs[x]] = fa[x] = x;
    return x;
}
void pushup(int x){
    if(!x) return;
    if(dis[ls[x]] < dis[rs[x]]) std::swap(ls[x], rs[x]);
    if(dis[x] != dis[rs[x]] + 1){
        dis[x] = dis[rs[x]] + 1;
        pushup(fa[x]);
    }
    return;
}
void erase(int x, int y){
    int z = merge(ls[x], rs[x]);
    if(fa[x] == x) root[y] = fa[z] = z;
    else{
        fa[z] = fa[x];
        if(ls[fa[x]] == x) ls[fa[x]] = z;
        if(rs[fa[x]] == x) rs[fa[x]] = z;
        pushup(fa[x]);
    }
    ls[x] = rs[x] = dis[x] = 0;
    fa[x] = z;
    return;
}
int main(){
    scanf("%d%d", &n, &T);
    for(int i = 1;i <= n;i++){
        scanf("%lld", &a[i]);
        fa[i] = root[i] = i;
    }
    while(T--){
        scanf("%d%d", &opt, &x);
        if(!opt){
            scanf("%d", &y);
            erase(y, x);
        } else if(opt == 1) printf("%lld\n", a[root[x]]);
        else if(opt == 2){
            scanf("%d", &y);
            root[x] = root[y] = merge(root[x], root[y]);
        } else {
            scanf("%d%lld", &y, &z);
            erase(y, x);
            a[y] = z;
            fa[y] = y; //root[y] = y;
            root[x] = root[y] = merge(root[x], y);
        }
    }
    return 0;
}
如题,在代码末尾注释处如果去掉正常 AC,但是加上会 20 MLE(Subtask0 除了前面两个点都爆),请问这是什么原因?为什么加上这行代码就会 MLE?

回复

1 条回复,欢迎继续交流。

正在加载回复...