警示后人:如果你树套树疯狂 MLE
查看原帖
警示后人:如果你树套树疯狂 MLE
468657
lsj2009Isj2OO9楼主2023/7/26 19:59

交了 2020 多发,卡了一个小时,在此警示后人:

  • 不要用线段树套树套树,用树状数组套线段树能使外层树节点减少 14\frac{1}{4},也就是全局使用节点减少 14\frac{1}{4}。

  • 如果还是没过,请动态删除无用节点(即 update 某点子树内不保存信息,则将该子树删除)。注意,下面写法是错误的:

stack<int> s; int p;
int new_node() {
    if(!s.empty()) {
        int tmp=s.top(); s.pop();
        tree[tmp]={0,0,0};
        return tmp;
    }
    return ++p;
}
void del_node(int &k) {
    s.push(k); k=0;
}

因为 del_node 函数只删除了根节点,而没有删除整棵子树;使用下面写法即可通过本题:

#define ls(k) tree[k].lson
#define rs(k) tree[k].rson
stack<int> s; int p;
int new_node() {
    if(!s.empty()) {
        int tmp=s.top(); s.pop(); tree[tmp]={0,0,0}; return tmp;
    }
    return ++p;
}
void del_node(int &k) {
    if(ls(k)) del_node(ls(k));
    if(rs(k)) del_node(rs(k));
    s.push(k); k=0;
}
2023/7/26 19:59
加载中...