吃掉后人,关于珂朵莉树做法
  • 板块P1382 楼房
  • 楼主Tachibana27
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/1/15 15:55
  • 上次更新2025/1/15 20:14:24
查看原帖
吃掉后人,关于珂朵莉树做法
663199
Tachibana27楼主2025/1/15 15:55

估计只有我这么傻了/kk

如果你在处理相同高度的房屋时,把几个房屋合并成一个时,重新扔回容器中的左右端点和值不应当使用原来的房屋的值,因为可能被 erase 掉了。

inline void merge(int pos){
    iit itl=s.lower_bound(pos);
    if(itl==s.begin() or itl==s.end())
        return;
    iit itll=itl;
    iit itr=itl;
    itll--;
    itr++;

    if(itr!=s.end() and itll->v==itl->v and itl->v==itr->v and itll->v==itr->v){
        itr++;
        s.erase(itll,itr);//罪魁
        itr--;
        s.insert(odt(itll->l,itr->r,itl->v));
    }
    else if(itll->v==itl->v){
        itl++;
        s.erase(itll,itl);//祸首
        itl--;
        s.insert(odt(itll->l,itl->r,itl->v));
    }
    else if(itr!=s.end() and itl->v==itr->v){
        itr++;
        s.erase(itl,itr);//都怪你呜呜呜
        itr--;
        s.insert(odt(itl->l,itr->r,itl->v));
    }
    else;
    return;
}

这样子是错的,应当使用以下写法:


inline void meg(int pos){
    iit itl=s.lower_bound(pos);
    if(itl==s.begin())
        return;
    iit itll=itl;
    iit itr=itl;
    itll--;
    itr++;
    if(itr!=s.end() and itll->v==itl->v and itl->v==itr->v and itll->v==itr->v){
        iit rr=itr;
        iit ll=itll;
		itr++;
        s.erase(itll,itr);
        s.insert(odt(ll->l,rr->r,rr->v));
    }
    else if(itll->v==itl->v){
    	iit rr=itl;
    	iit ll=itll;
        itl++;
        s.erase(itll,itl);
        s.insert(odt(ll->l,rr->r,rr->v));
    }
    else if(itr!=s.end() and itl->v==itr->v){
        iit rr=itr;
        iit ll=itl;
		itr++;
        s.erase(itl,itr);
        s.insert(odt(ll->l,rr->r,rr->v));
    }
    else;
    return;
}
2025/1/15 15:55
加载中...