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

news/2025/2/21 3:52:20/文章来源:https://www.cnblogs.com/zhr0102/p/18350010

双倍经验: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\) 。)

image

可以发现,点 \(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

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

首先我们画个图:

image

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

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

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

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

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

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

二分图思路

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780076.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的Linux分支

市面上可以接触到的Linux发行版本都是基于Linux内核和GUN协议开发出来的,当然还有一切企业内部自己开发定制的OS不在讨论范围,本随笔用于记录市面上常见的分支家族,如果对某个分支特别感兴趣可以自行深入了解

自适应PID控制器的simulink建模与仿真

1.课题概述对PID控制器参数kp,ki,kd进行参数自适应调整,实现PID控制器的最优控制,输出PID控制器,参数kp,ki,kd的收敛过程。2.系统仿真结果 kp,ki,kd的收敛过程如下:控制器输出如下:参考输入和控制器反馈输出的误差如下:3.核心程序与模型 版本:MATLAB2022a4.系统原理…

简单算法

冒泡排序// 冒泡排序加去重 public static int[] DistinctAndOrder(int[] OldArray) {if (OldArray != null && OldArray.Length > 0){//排序for (int i = 0; i < OldArray.Length - 1; i++){for (int j = 0; j < OldArray.Length - i - 1; j++){if (OldArray…

画廊 (2023 年 11 月至 2024 年 2 月中旬)

Gallery (II)上图于 2023 年 11 月 11 日摄于深圳技术大学。上图于 2023 年 11 月 12 日摄于深圳技术大学。上图于 2023 年 11 月 25 日摄于合肥中科大。上图于 2023 年 12 月 2 日摄于济南人民会堂。上图于 2023 年 12 月 9 日摄于北京密云。上图于 2024 年 1 月 20 日摄于绵阳…

SPSS、Python员工满意度问卷调查激励保健理论研究:决策树、随机森林和AdaBoost|附代码数据

全文链接:https://tecdat.cn/?p=37293 原文出处:拓端数据部落公众号 在深入了解公司当前的实际情况和员工内心真实想法的基础上,我们旨在从专业视角出发,为企业在组织管理方面的不足进行诊断,并进行全面审视。 为了更好地规划公司未来的发展方向,综合管理部特别组织了这…

Gradio

BiliBili视频 官网:https://www.gradio.app/ 为AI模型快速搭建交互式界面。根据AI模型需求,生成输入和输出组件,简化用户界面的构建过程。起步 基础安装pip install gradio官网示例import gradio as grdef greet(name, intensity):return "Hello, " + name + &quo…

IDEA 2024.2 正式发布,速览新功能!

0 前言 IntelliJ IDEA 2024.2 允许你直接在 IDE 运行 Spring Data JPA 方法,即时验证存储库查询。 简化了 cron 表达式管理,提供内联描述和高级自动补全功能,并升级 HTTP 客户端,使其使用 GraalJS 执行引擎。 该版本通过在项目索引期间启用关键功能,提高 IntelliJ IDEA 整…

片 - 树上问题 - 1

欢迎来看 “片” (的简介) 由于-\(看片\)-生涯转瞬即逝,于是我选择对“\(片\)”进行一定的总结: 相信你一定看懂了 由于开始的时间有一点晚,就姑且认为我以后会慢慢补充吧...... 回到总部 点分治 \(P4178\) \(Tree\) 解: 树的重心,树上\(DFS\)搜索,点分治 经过(两)天…

jwt伪造身份组组组合拳艰难通关

现在的攻防演练不再像以往那样一个漏洞直捣黄龙,而是需要各种组合拳才能信手拈来,但是有时候使尽浑身解数也不能称心如意。前言 现在的攻防演练不再像以往那样一个漏洞直捣黄龙,而是需要各种组合拳才能信手拈来,但是有时候使尽浑身解数也不能称心如意。 前期信息收集 首先是…

Genomics | 转录组和代谢组分析揭示了铁皮石斛中黄酮类化合物的积累

铁皮石斛是一种在中国有着悠久使用历史的中草药。黄酮是铁皮石斛重要的次生代谢产物,但其在铁皮石斛中的分子调控机制尚不清楚。在这项研究中,作者收集了一年到四年生的铁皮石斛茎,用于rna测序和质谱数据收集。结果表明,代谢组学分析检测到124种不同的类黄酮代谢物,其中黄…

包机制

1.包机制2.正确建立包 先找到Tree Appearance中找到compact middle package,取消勾选。然后右键src 新建一个package 一般利用公司域名倒置作为包名 如:com.zhiShi.www3.导包 使用import可以指定包中的某个成员如果文件太多,可以选择* *是选择所有文件

获取窗口大小 极语言

程序段 窗体启动 整数 width,height; 矩形类 矩形; 取客户区(窗体, &矩形); width = 矩形.宽-矩形.左; height =矩形.高-矩形.顶; 文本 x[5]=width; 文本 y[5]=height; 信息框(0,x,"你好",信息图标); 信息框(0,y,"你好",信息图标); 结束看下图,注意我截…