估计只有我这么傻了/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;
}