这其实是一道并查集的题目,我们可以设 fff 为 aaa 的前缀和,那么从 lll 到 rrr 的和即为 fr−fl−1f_r-f_{l-1}fr−fl−1。
因为题目要求求出数组的前缀和,那么其实就是在求 fn−f0f_n-f_0fn−f0 的值。所以,我们可以直接利用并查集,每次合并将 rrr 和 l−1l-1l−1 合并。最后,查找一下 000 是否可以连接到 nnn 就行了。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,father[100000005];
void ycl()//预处理
{
for(register int i=1;i<=100000004;i++)
{
father[i]=i;//先将自己的祖先点设为自己
}
}
int find(int x)
{
return father[x]==x?x:father[x]=find(father[x]);//路径压缩
}
signed main()
{
cin>>n>>q;
ycl();
for(register int i=1;i<=q;i++)
{
int l,r;
cin>>l>>r;
father[find(l-1)]=find(r);//合并
}
cout<<((find(0)==find(n))?"Yes":"No");//判断是否能到
return 0;
}
文章介绍了如何使用并查集数据结构来计算数组的前缀和,通过预处理和路径压缩优化,判断指定区间是否可以通过连续合并到达。
1067

被折叠的 条评论
为什么被折叠?



