双倍经验:Luogu P5089 元素周期表CF1012B Chemical table:模拟赛搬的好题,有点厉害。赛时10min码的假贪心拿了五十多分,赢。

并查集思路 1

对于此类棋盘整行整列覆盖问题,有一个通用思路:把每一行和每一列看作一个点,那么原本棋盘上的格子就可以看作是连接这些点的边。例如一个点是 \((x,y)\) ,那么我们就可以把行 \(x\) 代表的点与列 \(y\) 代表的点连一条边。

这样做的原因是如果确定了行与列,那么我们就可以确定唯一的点。并且本题还是整行整列地进行覆盖的,数据范围较大,只能通过此类表达方式来把原来 \(10^{12}\) 级别的点,化为 \(10^{12}\) 级别的边;剩下点的个数就为 \(2 \times 10^6\) 级别。

一些这种图的性质:

  • 如果第 \(i\) 行与第 \(j\) 列联通,可以当成格子 \((i,j)\) 处有一个点。
  • 本质上是把每个已有的格子,从横纵两个方向散开直线,这些直线只要形成交点,就是一个连通块。在本题中这么应用,是因为只要有 \(3\) 个点,我们就可以确定一个矩形。

接下来思考核聚变的过程:

对于点 \((x_1,y_1),(x_1,y_2),(x_2,y_1),(x_2,y_2)\) 组成一个矩形 ,我们先假设 \((x_2,y_2)\) 还没有生成。

那么连出的图就长这样:(圆表示 \(x\) ,方表示 \(y\) 。)

可以发现,点 \(x_2\) 与点 \(y_2\) 已经是联通的了,并且由于上述的第一条性质:如果第 \(i\) 行与第 \(j\) 列联通,可以当成格子 \((i,j)\) 处有一个点。此时的点已经自动被拓展了出来。

于是,我们只需要把 \(n+m\) 个所有的点都合并成一个连通块,就可以了。

这个过程可以用并查集维护。

合并的次数就是连通块的个数 \(-1\) 。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,q,f[2000005],ans=0;
void init()
{
for(int i=1;i<=n+m;i++)f[i]=i;
}
int findf(int x)
{
if(f[x]!=x)f[x]=findf(f[x]);
return f[x];
}
void combine(int x,int y)
{
int fx=findf(x),fy=findf(y);
f[fx]=fy;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>q;
init();
while(q--)
{
int x,y;
cin>>x>>y;
combine(x,y+n);
}
for(int i=1;i<=n+m;i++)
{
ans+=(findf(i)==i);
}
cout<<ans-1;
return 0;
}

并查集思路 2

某位金钩爷的做法,有点复杂,但也好理解。这种做法是单纯从本题的生成点的性质入手,而上一种做法就是单纯从套路上入手。

首先我们画个图:

可以发现,如果相邻两行的同一列有棋子(蓝色部分),那么这两行就完全同步状态了。例如我们往第一行加上一些绿色点,那么我们下面的紫色部分也会加上一些点。他们的状态是完全同步的。

进一步拓展结论,就可以得到如果任意两行的同一列有棋子,那么这两行就同步状态了,所以他们就成连通块了。

最终我们拓展完后,一定会形成一些没有相同列的连通块。

于是我们一开始就把行看成点,对有相同列的进行合并,统计连通块个数(空行不能和空行算一个连通块)。

然后特判一下有没有空列,答案就是连通块个数 \(-1\) 加上空列个数。

比上一种好理解一点。代码就不写了,我懒。

二分图思路

和并查集思路 1 的做法差不多,把二分图分成上面行一部分,下面列一部分,然后照常合并。

然后遇到不连通的部分合并一下,统计一下就好了。基本和并查集一样。

代码就不写了,我懒。*2

Luogu P5089 元素周期表 / Codeforces 1012B Chemical table 题解 [ 并查集 ] [ 二分图 ] [ 图论建模 ] [ 棋盘覆盖问题 ]的更多相关文章

  1. Codeforces 1012B Chemical table (思维+二分图)

    <题目链接> 题目大意:给定一个n*m的矩阵网格,向其中加点,对于一个组成矩形的四个点中如果有三个点中有元素,那么第四个点中会自动产生新的元素.问你最少再加多少个点能够填满这个网格.解题分 ...

  2. Codeforces Round #345 (Div. 2) E. Table Compression 并查集

    E. Table Compression 题目连接: http://www.codeforces.com/contest/651/problem/E Description Little Petya ...

  3. Codeforces Round #345 (Div. 2) E. Table Compression 并查集+智商题

    E. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  4. Codeforces Round #345 (Div. 1) C. Table Compression (并查集)

    Little Petya is now fond of data compression algorithms. He has already studied gz, bz, zip algorith ...

  5. Codeforces 859E Desk Disorder:并查集【两个属性二选一】

    题目链接:http://codeforces.com/problemset/problem/859/E 题意: 有n个人,2n个座位. 给出这n个人初始的座位,和他们想坐的座位. 每个人要么坐在原来的 ...

  6. codeforces 456 E. Civilization(并查集+数的直径)

    题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...

  7. CodeForces - 1209D Cow and Snacks 并查集

    CodeForces - 1209D 题意 现在n种点心,每种点心只有一份,有k位客人,每位客人有两种想要吃的点心,你可以安排他们进场的顺序,每位客人会吃掉所有他想要吃的,并且还没被吃掉的点心.如果客 ...

  8. Codeforces 699D Fix a Tree 并查集

    原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...

  9. Codeforces 731C:Socks(并查集)

    http://codeforces.com/problemset/problem/731/C 题意:有n只袜子,m天,k个颜色,每个袜子有一个颜色,再给出m天,每天有两只袜子,每只袜子可能不同颜色,问 ...

  10. codeforces 400D Dima and Bacteria 并查集+floyd

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...

随机推荐

  1. Graylog之安装

    Graylog是一个开源的日志聚合.分析.审计.展现和预警工具.功能上和ELK类似,但又比ELK要简单,依靠着更加简洁,高效,部署使用简单的优势很快受到许多人的青睐 安装部署: 单机部署,最小化部署 ...

  2. yum之镜像加速

    有没有遇到使用yum安装软件慢如龟,默认的系统使用的是centos的镜像源,我们可以修改为国内镜像源加速软件安装 163)http://mirrors.163.com/.help/centos.htm ...

  3. PythonDay4Advance

    PythonDay4Advance 函数 引言:比如植物大战僵尸,这个游戏本身也是由代码编写,现在假设有一种豌豆射手,每发射一次 炮弹会执行100行逻辑代码 如果我在程序,每当需要发射炮弹的时候,都要 ...

  4. Input报错“Form elements must have labels: Element has no title attribute Element has no placeholde”

    喵~ 项目开发难免会遇到些不解的问题,以下总结的是简化版,重在复现问题,解决问题. 写表单时,如果只是单独写了input元素,发现在后台管理会飘红.感觉很奇怪,明明没有写错语法,为什么会飘红呢? 1. ...

  5. uni-app PDA扫描

    1.前言 PDA扫码是工厂项目中是非常常见的功能,这里记录下工作中的开发思路和模板,仅供参考 PDA扫码模式:模拟输入和广播模式 模拟输入:模拟键盘输入,一般后面会设置追加一个回车,优点是通用型强,缺 ...

  6. 从Delphi到Lazarus——Lazarus编程时可以使用的组件(控件)

    0.前言 使用过可视化编程的人都知道在编程时组件的重要性.可以使用的组件越多,编程越方便快捷. 理论上,Delphi中的所有组件在Lazarus中都可以使用.当然,在Windows编程时多数是可以直接 ...

  7. 天地图接口Python代码详解

    天地图是中国国家测绘地理信息局推出的一款权威.全面的在线地理信息系统,提供了丰富的卫星影像.地形.矢量图等地图资源.开发者可以通过天地图提供的API接口,实现地图的展示.搜索.定位等功能.本文将详细介 ...

  8. 【Linux】职教云作业

    作业_职教云_Day01 @ 哔哩哔哩 萌狼蓝天 1.由普通用户切换到root用户 su 2.列出home目录下的各个文件名字 cd /home ls 3.在/etc/目录下显示以sysc开头的所有命 ...

  9. Qt编写可视化大屏电子看板系统28-模块6送检合格

    一.前言 送检合格率模块包括钢件合格率.电机合格率.当天合格率.模具零件合格率四个子模块,其中钢件合格率和电极合格率都是采用的曲线图展示,统计的15天内的合格率,定位线放在90这个值的位置,相当于90 ...

  10. 用 Ingram 和 masscan 来扫描全网存在漏洞的camera

    前言 大学的时候也写过和Ingram差不多的工具,不过那时候已经玩到没有兴致了,代码已不知道哪里去.没想到在Github看到了这个工具,实现思路和我的几乎一样,互联网就是这么神奇. Ingram的Gi ...