splay 的 insert 操作,感觉两种写法差不多,但是一种是错的
  • 板块学术版
  • 楼主AC_loveRealNewbie
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/11/30 08:00
  • 上次更新2023/11/30 15:19:15
查看原帖
splay 的 insert 操作,感觉两种写法差不多,但是一种是错的
186472
AC_loveRealNewbie楼主2023/11/30 08:00

这个是对的:

void ins(int x)
{
	if(!root)
	{
		root = ++ tot;
		cnt[tot] = 1;
		sz[tot] = 1;
		val[tot] = x;
		return;
	}
	int cur = root, f = 0;
	while(1)
	{
		if(val[cur] == x)
		{
			cnt[cur] ++;
			sz[cur] ++;
			pushup(f);
			splay(cur);
			return;
		}
		f = cur;
		cur = son[cur][val[cur] < x];
		if(!cur)
		{
			cnt[++ tot] = 1;
			val[tot] = x;
			sz[tot] = 1;
			sz[f] += 1;
			fa[tot] = f;
			son[f][val[f] < x] = tot;
			splay(tot);
			return;
		}
	}
}

这个会寄:

void ins(int x)
{
	if(!root)
	{
		root = ++ tot;
		cnt[tot] = 1;
		sz[tot] = 1;
		val[tot] = x;
		return;
	}
	int cur = root, f = 0;
	while(1)
	{
		if(val[cur] == x)
		{
			cnt[cur] ++;
			sz[cur] ++;
			sz[f] ++;
			splay(cur);
			return;
		}
		f = cur;
		cur = son[cur][val[cur] < x];
		if(!cur)
		{
			cnt[++ tot] = 1;
			val[tot] = x;
			sz[tot] = 1;
			sz[f] += 1;
			fa[tot] = f;
			son[f][val[f] < x] = tot;
			splay(tot);
			return;
		}
	}
}

它俩的区别在于:

		if(val[cur] == x)
		{
			cnt[cur] ++;
			sz[cur] ++;
          
			正确的:
			pushup(f);
			错误的:
			sz[f] ++;
          
			splay(cur);
			return;
		}

但是我感觉这两个语句应该是等效的啊,为什么会出问题呢

2023/11/30 08:00
加载中...