首页 > 其他分享 >题解 [ABC279F] BOX

题解 [ABC279F] BOX

时间:2022-11-27 09:22:56浏览次数:45  
标签:BOX rt 查集 int 题解 dsu ABC279F fa id

这种合并集合的操作使我们想到并查集,因此我们在并查集算法的基础上进行改造来解决问题。这里使用路径压缩实现的并查集。

在记录并查集的父亲数组的同时,我们还需要记录两个数组 \(rt\) 和 \(id\),\(rt_i\) 表示题目中所说的第 \(i\) 个集合的根是哪个元素(若为空则为 \(0\)),\(id_i\) 表示这个元素是哪个集合的根(若不是则为 \(0\))。

操作一可以直接合并。操作二在并查集中新建一个节点,若这个集合的 \(rt\) 为 \(0\),则把它直接设为 \(rt\),否则把它挂到 \(rt\) 下面作为一个儿子。操作三找到所在集合的根节点然后看 \(id\) 即可。

时间复杂度 \(\Theta(m\log m)\),\(\log\) 是路径压缩并查集的。

// Problem: F - BOX
// Contest: AtCoder - TOYOTA SYSTEMS Programming Contest 2022(AtCoder Beginner Contest 279)
// URL: https://atcoder.jp/contests/abc279/tasks/abc279_f
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
using namespace std;
typedef long long ll;
const int N = 1e6+5;

int n, m;
template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}
struct Dsu {
	int fa[N], rt[N], id[N];
	int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
	void merge(int x, int y) {
		if(!rt[y]) return;
		if(!rt[x]) {
			id[rt[y]] = x;
			rt[x] = rt[y];
			rt[y] = 0;
			return;
		}
		id[rt[y]] = 0;
		fa[rt[y]] = rt[x];
		rt[y] = 0;
	}
}dsu;

int main() {
	scanf("%d%d", &n, &m);
	rep(i, 1, n) dsu.fa[i] = dsu.rt[i] = dsu.id[i] = i;
	while(m--) {
		int op, x, y;
		scanf("%d%d", &op, &x);
		if(op == 1) {
			scanf("%d", &y);
			dsu.merge(x, y);
		}
		else if(op == 2) {
			++n;
			if(!dsu.rt[x]) dsu.rt[x] = dsu.fa[n] = n, dsu.id[n] = x;
			else dsu.fa[n] = dsu.rt[x];
		}
		else printf("%d\n", dsu.id[dsu.find(x)]);
	}
	return 0;
}

标签:BOX,rt,查集,int,题解,dsu,ABC279F,fa,id
From: https://www.cnblogs.com/ruierqwq/p/abc279f.html

相关文章

  • 题解 [ABC279E] Cheating Amidakuji
    曾经总结过一类分治套路,没想到竟然派上用场了。这种每个操作依次缺席的问题可以通过分治来解决。设solve(l,r)表示缺席的操作在\([l,r]\)之间时求出它们的答案。设......
  • VirtualBox 的安装
    虚拟机仅仅是一个软件,运行在各种主流的操作系统上。它以自己运行的真实计算机为模板,虚拟出另一套处理器、内存和外部设备来。它的处理能力,完全来自于背后那台真实的计算机......
  • ES系列二之常见问题解决
    上篇ES系列一之java端API操作结束后本以为就相安无事了,但生产的问题是层出不穷的;下面我就再记录下近几周遇到的问题以及解决方案;一更新ES信息报错报错信息如下:UseElas......
  • 『题解』UVA 240 Variable Radix Huffman Encoding
    题目传送门题意哈夫曼编码是一种最优编码方法。根据已知源字母表中字符出现的频率,将源字母表中字符编码为目标字母表中字符,最优的意思是编码信息的平均长度最小。在该问......
  • 『题解』UVA 210 Concurrency Simulator
    题目传送门按题意使用队列和双端队列模拟。其中就绪队列使用双端队列,阻止队列使用普通队列。p=58printalockunlockend我们观察一下这几个指令,可以发现......
  • 『题解』Codeforces 808D Array Division
    题目传送门解题思路首先统计\(n\)个数字和为\(sum\),那么一半就是\(sum=sum\div2\)从\(1\)到\(n\)枚举,累计进前缀和\(ans\)中,如果发现第\(i\)个数字累......
  • 『题解』UVA 10534 Wavio Sequence
    题目传送门题意\(Wavio\)是整数序列,有如下特点:它的长度总为奇数,即\(2n+1\);前\(n+1\)个数构成一个严格的上升序列,后\(n+1\)个数构成一个严格下降的序列;任意......
  • 『题解』UVA 10795 A Different Task
    题目传送门双倍经验:LuoguP1242分析汉诺塔相信每一个合格的OIer都听说过并且实现过。这是一个递归的程序。汉诺塔本来就有两个规则:一次只能移动最上面的一个盘......
  • 『题解』UVA 148 Anagram checker
    题目传送门分析貌似除了递归式暴力搜索外,没有其它的有效算法了。这样的话,对代码性能的要求就比较高了,为了快速的判断一个短语是否包含某个单词,必须找出一种特定的数据结......
  • 『题解』UVA 12676 Inverting Huffman
    题目传送门题意静态哈夫曼编码是一种主要用于文本压缩的编码算法。给定一个由\(N\)个不同字符组成的特定长度的文本,算法选择\(N\)个编码,每个不同的字符一个编码。使......