题目描述
- 在一条数轴上有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);