ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF797D Broken BST

2022-01-03 22:35:19  阅读:201  来源: 互联网

标签:ma BST dfs Broken int CF797D rm now


洛谷题面

顺着树剖的推荐题目点进来的,没想到压根不是树剖,代码还很短 \(\verb!qwq!\)。

题目大意

给定一棵 \(\rm BST\),但是不保证这是一棵正确的 \(\rm BST\)。

请计算有多少节点不会被遍历到。

题目分析

在 \(\rm BST\) 中,节点 \(u\) 一定满足 \(val[ls(u)]<val[u],val[rs(u)]>val[u]\),根据这个性质,一个数能够被找到当且仅当 \(l<val[u]<r\)。

在 \(\rm dfs\) 过程中,我们使用 \(map\) 来映射每个节点是否被找到,最后查找就很方便。

于是就做完了。

代码

注意 dfs(rt,-1,1e9+1),因为 \(\rm dfs\) 中我们是 <>,所以这里应当满足 \(l\ge0-1,r\le10^9+1\)。

//2022/1/3

const int ma=1e5+5;

int a[ma],ls[ma],rs[ma];

bool have_fa[ma];

int n;

map<int,bool>mp;

inline void dfs(int now,int l,int r)
{
	if(now==-1)
	{
		return;
	}
	
	if(a[now]>l && a[now]<r)
	{
		mp[a[now]]=true;
	}
	
	dfs(ls[now],l,min(r,a[now]));
	
	dfs(rs[now],max(l,a[now]),r);
}

int main(void)
{
	n=read();
	
	for(register int i=1;i<=n;i++)
	{
		a[i]=read(),ls[i]=read(),rs[i]=read();
		
		if(ls[i]!=-1)
		{
			have_fa[ls[i]]=true;
		}
		
		if(rs[i]!=-1)
		{
			have_fa[rs[i]]=true;
		}
	}
	
	int rt;
	
	for(register int i=1;i<=n;i++)
	{
		if(have_fa[i]==false)
		{
			rt=i;
			
			break;
		}
	}
	
	dfs(rt,-1,1e9+1);
	
	int ans=0;
	
	for(register int i=1;i<=n;i++)
	{
		if(mp[a[i]]==false)
		{
			ans++;
		}
	}
	
	printf("%d\n",ans);
	
	return 0;
}

标签:ma,BST,dfs,Broken,int,CF797D,rm,now
来源: https://www.cnblogs.com/Coros-Trusds/p/15760757.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有