题目链接:
atcoder.jp/contests/ab…
知道
m个区间的区间和,问是否能够求出整个序列的和
思路:
设一个前缀和数组b[],区间和就要刻意向前缀和进行考虑。
则 [ l , r ] [l,r] [l,r]区间的和可以由 b r − b l − 1 b_r-b_{l-1} br−bl−1求得,问是否能够得到 b n b_n bn,只需要将l-1和r联系起来,当成图中的一条边,最后只需要看点n和点0是否联通即可(使用并查集判断)。
感觉有必要重新学习下并查集的结构体写法,所以就照着题解写下代码。
#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353,N = 2e5+5;
typedef long long ll;
struct dsu
{
vector<int>f,sz;
dsu(int n)
{
f.resize(n);
sz.resize(n,1);
for(int i=0;i<n;i++) f[i] = i;
}
int find(int x)
{
return x==f[x] ? x : f[x] = find(f[x]);
}
void merge(int x,int y)
{
x = find(x);
y = find(y);
if(x == y) return ;
if(sz[x] < sz[y]) swap(x,y);
f[y] = x;
sz[x] += sz[y];
sz[y] = 0;
}
};
void solve()
{
int n,q;
cin>>n>>q;
dsu tree(n+1);
while(q--)
{
int l,r;
cin>>l>>r;
tree.merge(l-1,r);
}
if(tree.find(0) == tree.find(n)) cout<<"Yes\n";
else cout<<"No\n";
}
int main()
{
int t;
// cin>>t;
t = 1;
while(t--) solve();
return 0;
}