双倍经验: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. golang之性能分析工具pprof

    PProf 是一个 Go 程序性能分析工具,可以分析 CPU.内存等性能.Go 在语言层面上集成了 profile 采样工具,只需在代码中简单地引入 runtime/ppro 或者 net/http/ ...

  2. CF 3000+

    CF1981F / *3000 首先有朴素的 dp:\(f_{u, i}\) 表示以 \(u\) 为根的子树已经 finish 了,经过 \(u\) 往上走的路径 MEX 为 \(i\).\(i\) ...

  3. 【docker-compose】Redis安装教程

    仅供学习参考 ,请勿轻易在生产环境使用 0. 文件目录 下面的文件按照这个目录层级放置,首先创建 /docker/redis 文件夹,/docker/redis 对应下边图中 REDIS. 1. 创建 ...

  4. 微信开发者工具请求接口 Provisional headers are shown

    前情 最近全权负责公司小程序项目的开发,使用的uniapp技术栈. 坑 在和服务端联调的时候发现,接口pending很久,而且时不时的报Provisional headers are shown,而且 ...

  5. vue 相同路由不同参数跳转时,不刷新

    在公共的router-view上加 :key="$route.fullPath  控制key属性变化

  6. hive表元数据读取不到

    MetaException(message:java.lang.UnsupportedOperationException: Storage schema reading not supported) ...

  7. java - 正则表达式替换Spring @RequestMapping URL中的@PathVariable值

    我在接口(只是为了保存常量)中有Spring MVC URL的定义,例如: String URL_X = "/my-url/{id:[0-9]*}"; String URL_Y = ...

  8. Mac安装thrift因bison报错的解决办法

    安装thrift时,报错: Bison version 2.5 or higher must be installed on the system! 使用brew install bison 安装新版 ...

  9. Linux系统手动安装Firefox浏览器

    大多数Linux发行版都以Firefox作为默认的浏览器,并可以轻松地从软件库中安装.例如:Debian/Ubuntu: sudo apt-get install firefoxFedora: sud ...

  10. Qt音视频开发2-vlc回调处理

    一.前言 用句柄来显示视频,方便是很方便,但是有个缺点就是不能拿到实时视频的每张图片的数据,这个就比较讨厌,大部分的监控行业的应用,除了截图以外,很可能需要拿到图片自己做一些处理的,而且拿到图片自己绘 ...