并查集区间问题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 brbl1求得,问是否能够得到 b n b_n bn,只需要将l-1r联系起来,当成图中的一条边,最后只需要看点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的主要内容,如果未能解决你的问题,请参考以下文章

并查集-解决区间和纠错问题 hdu-3038

HDU-3038How Many Answers Are Wrong权值并查集

经典模型——并查集解决区间/树链染色问题

区间 (模拟并查集优化)

poj3667(并查集区间合并&区间查询)

Restructuring Company和Almost Union-Find 并查集的区间合并与并查集的删除