并查集的神奇应用

题目描述

  • 在一条数轴上有n个点,分别为 1~ n。一开始所有的点都被染成黑色。接着进行m 次操作,第i 次操作将l ~ r 这些点染成白色。请输出每个操作执行后剩余黑色点的个数。

思路

  • 显然可以用线段树来做,但是会超时,这里讲一种并查集的做法。
  • 我们可以用并查集维护每个点右边的第一个黑色点的位置,然后对于每次操作我们就可以很快地知道这次操作使该区间多少个点变成了白色。
  • 其实这种思路和这道题很像,都是用并查集来优化的。

核心代码

int l=read(),r=read();
if(!f[l]) ans--,f[l]=1;
if(l==find(l)) fa[l]=l+1;
int x=find(l);
while(x<=r)
{
	ans--;
	f[x]=1;
	fa[x]=x+1;
	x=find(x);
}
printf("%d\n",ans);	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Robin_w2321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值