社区讨论
关于 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 条回复,欢迎继续交流。
正在加载回复...