并查集区间问题E - Range Sums
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集区间问题E - Range Sums相关的知识,希望对你有一定的参考价值。
题目链接:
https://atcoder.jp/contests/abc238/tasks/abc238_e
知道
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;
以上是关于并查集区间问题E - Range Sums的主要内容,如果未能解决你的问题,请参考以下文章