动态树(LCT)错误总结

汇总犯过的一大堆神奇错误。

访问儿子结点时,没有pushDown(),左右儿子未翻转。

例:

Node *findRoot(Node *u)
{
	Access(u);
	Splay(u);
	//这里漏掉一句:u->pushDown();
	while(u->ch[0]!=null)
	{
		u=u->ch[0];
		u->pushDown();
	}
	return u;
}

解决方法:
写完后搜索所有->ch,检查是否之前已pushDown()

pushUp()更新时,儿子结点未更新,仍存在懒标记

解决方法:
使 u u u结点懒标记意义表示 u u u的儿子结点需更新,而不是 u u u需要更新。
###懒标记下传后未清空
例:

void pushDown()
{
	ch[0]->Update(add,rev);
	ch[1]->Update(add,rev);
	//漏了以下两句
	//add=0;
	//rev=false;
}

自定义空指针null内部信息错误

例:

null->fa=null->ch[0]=null->ch[1]=null;
null->siz=1;//这里应=0

Cut操作判断删除的u->v边是否存在时,判断错误

例:

void Cut(Node *u,Node *v)
{
	makeRoot(u);
	Access(v);
	Splay(u);
	u->pushDown();
	if(u->ch[1]!=v)//还需判断    ||v->siz!=1
		return;
	u->setChild(null,1);
	v->fa=null;
}

用翻转懒标记更新时,直接将标记改为true,没有取反

	void Update(bool re)
	{
		if(this==null)
			return;
		if(re)
		{
			swap(ch[0],ch[1]);
			rev=true;//应为rev^=1
		}
	}

FindRoot后没有Splay,导致复杂度变高

Node *Root(Node *u)
{
	Access(u);
	Splay(u);
	u->PushDown();
	while(u->son[0]!=null)
		u=u->son[0],u->PushDown();
	//少了Splay(u);
	return u;
}

持续更新……

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值