这其实是一道并查集的题目,我们可以设 f f f 为 a a a 的前缀和,那么从 l l l 到 r r r 的和即为 f r − f l − 1 f_r-f_{l-1} fr−fl−1。
因为题目要求求出数组的前缀和,那么其实就是在求 f n − f 0 f_n-f_0 fn−f0 的值。所以,我们可以直接利用并查集,每次合并将 r r r 和 l − 1 l-1 l−1 合并。最后,查找一下 0 0 0 是否可以连接到 n n n 就行了。
代码
#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;
}