首页 > 其他分享 >P5089 [eJOI2018] 元素周期表 题解

P5089 [eJOI2018] 元素周期表 题解

时间:2022-09-23 17:03:00浏览次数:89  
标签:eJOI2018 二分 联通 规律 题解 元素 P5089 define

\(Preface\)

主要是想刷点咕值然后就写了一写。。。顺便扔到博客园这边。

题解

题目传送门

这道题嘛..主要还是找性质推规律。

拿到题,第一眼:噢噢爆搜啊。

第二眼:噢噢贪心啊。

第三眼:很好贪心假了。然后苦思冥想半个小时去看题解。

看到兔队的题解直接蚌了。二分图?

仔细思考了一下也是。\(x\text{、}y\) 坐标显然可以分成两个没有直接边相连的集合,而我们要做的就是将给出的点的 \(x\text{、}y\) 坐标连边,找规律。

考虑这样一张图。

# * * *
# # * *
* * * #

(#是已有的元素,*是空)

画成二分图是这样的:

然后我们把能够合成的点都合成一下,变成了这样:

# # * *
# # * *
* * * #

再画一下二分图:

发现了一个小规律。就是说能够拓展的点加入后对原图的连通性不产生影响,不过似乎这个规律并不是我们想要找的最终规律,我们且称这个规律为规律一。

那么继续探索。

如果我们在 \(row_3\) 和 \(column2\) 之间连一条边,也就是买一个元素 \((3,2)\),图会变成这样:

# # * *
# # * *
* # * #

拓展一下变成:

# # * #
# # * #
# # * #

如果只画给出的点和新买的点,二分图为:

如果画上新拓展的点,二分图变为:

然后发现了规律:如果某一行和某一列是联通的(不一定直接有边相连),那么他们之间就将会有边直接相连。

考虑这个规律的实际意义。

有边直接相连就代表着这个点 \((row_i,column_j)\) 在图中是已经获得的元素。那么如果整张图是联通的,那是不是意味着所有的点就都是已经获得的元素?!

确实如此。那么称这个规律为规律二,这就是我们想要找的最终规律。

那么我们想要的答案就是使得原图变为一个连通图的最小连边数,也就是联通分量数 \(-1\)。

至此此题就基本做完了。首先按照规律一,我们无需多余地去拓展,只需要将给出的点进行建边。建好边后直接求一下联通分量个数就好了。

\(Ps\):其实没必要把边建出来,直接用一个并查集维护即可。

#include <iostream>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define N 200005
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL);}
int n, m, num, jia, final_ans;
int fa[N<<1];
int find(int x){return ((fa[x] == x) ? (x) : (fa[x] = find(fa[x])));}
inline void work(){
	cin >> n >> m >> num; jia = n;
	for (re i = 1 ; i <= n+m ; ++ i)
		fa[i] = i;
	for (re i = 1, x, y ; i <= num ; ++ i){
		cin >> x >> y;
		x = find(x), y = find(y+jia);
		fa[x] = y;
	}
	for (re i = 1 ; i <= n+m ; ++ i)
		if (fa[i] == i)
			final_ans ++;
	cout << final_ans-1 << endl;
}
// #define IXINGMY
char_phi main(){
	#ifdef IXINGMY
		FBI_OPENTHEDOOR(a);
	#endif
	Fastio_setup();
	work();
	return GMY;
}

标签:eJOI2018,二分,联通,规律,题解,元素,P5089,define
From: https://www.cnblogs.com/charphi/p/16723313.html

相关文章

  • P4484题解
    很神奇的状态。。。。。。很难想象这是一个人能在考场上想到的状态。对于一个排列\(p\),设\(f_i\)表示以\(p_i\)结尾的LIS的长度。考虑排列计数的套路令所有元素......
  • Vue中使用benz-amr-recorder插件实现播放amr音频文件以及在线url跨域问题解决
    场景需要做一个Android端和Web端的聊天室,Android端的录音音频文件为.amr格式,除了通过后台server端转码之后,是否可以通过插件在前端直接播放amr的音频文件。benz-amr-rec......
  • 【NEERC2011】【GYM100085F】Flights 题解
    【NEERC2011】【GYM100085F】Flights题意给定\(n\)个抛物线,保证开口向下且与\(x\)轴的两个交点都在\(x\)轴正半轴或原点。\(m\)次询问,每次询问给定四个数\(L,R,......
  • 【题解】Race
    今天教练说让刷题,我去刷了。刷到这道题,挺好的。\(n\)个同学打了\(2^{m}\)次比赛,同学\(j\)第\(i\)次比赛的成绩是\(a_j\operatorname{xor}i\),每次获得的积分......
  • 题解 P7870 「Wdoi-4」兔已着陆
    不用真的模拟一个个的蛋糕。直接将一个区间压入栈中即可。取出来时,注意将断的区间一分为二重新塞入。#include<bits/stdc++.h>usingnamespacestd;#defineN1000010......
  • CF1430G 题解
    传送门题意给定一个有向无环图,每条边有权重\(w_i\),给每个点分配权值\(a_i\),使每个点的权值大于其所有出点。设每条边的权值为\(a_{x_i}-a_{b_i}\)。输出一种分配方案,......
  • 题解【P5588 hegm 爬树】
    题目传送门。来一个不一样的工程做法。我们直接对于每一个颜色\(i\)建虚树,显然可以通过树形DP来判断颜色\(i\)的节点是否在一条路径上。原题。然后存一下这条路径......
  • AtCoder Beginner Contest 043 题解
    欢迎来到我的算法小屋前言 TaskNameAChildrenandCandies(ABCEdit)BUnhappyHacking(ABCEdit)CBeTogetherDUnbalancedA1)题目描述2......
  • CF1540B Tree Array 题解
    CF1540BTreeArray给定一棵\(n\)个节点的树。对于这棵树,我们通过下列方法来生成一个序列:等概率选择这\(n\)个节点中的一个节点,并对这个节点打上标记(初始时没有节......
  • Dev C++中窗口输出中文问题解决
    1、window+R+regedit调出注册表  2、点击Dec_Dev-Cpp_ConsolePauser.exe 3、鼠标左键双击“CodePage”,弹出设置页面。选择“十进制”,输入65001  4、右键点......