Leetcode 765 情侣牵手 / Hetao-013 翅膀打结 题解 [ 黄 ] [ 并查集 ] [ BFS ] [ 贪心 ]
经典的连通块题,幸好我之前在 leetcode 看过原。
转化
首先观察到一对cp无论是男在前,还是女在前,都视为配对成功,对答案无影响。
因此,我们可以把一对情侣赋同一个编号,直接加一除以二即可。
同时,由于两个情侣要坐一起,所以最终形态一定是这样的
\(a,a,b,b,c,c,d,d,...,z,z\)
例如:
in:
3
3 5 4 6 2 1
out:
1
进行前面一步转化后,可以得到情侣的编号:
2 3 2 3 1 1
分析
接下来看如何将编号相同的两个人搞到一起去。
由上面分析得到的最终形态可知,我们要把这个序列分成 \(n\) 组,每一组为 \({{2(k-1),2(k-1)+1}}\) 。
然后对于每一组进行分析:
例如下面的例子:
(1,3) (3,1)
(1,3) (2,1) (3,2)
(1,3) (2,1) (3,2) (4,4)
可以发现,如果每一组内不是同一对情侣,那么就要和本组内另一个人的cp所在组里交换一遍,然后接下来再对后面的组一直换,直到形成了一个变换环。这个变换环的最终形态就像是上面的第一组例子,最后换一下就好了。
那么这个变换环最少操作次数怎么求?
可以参考冒泡排序的思考方式,每次选择一个放到序列最后面,只需 \(n-1\) 次操作就可以放完。
那么这个也可以类比一下,一个变换环最少操作次数便是环上节点数减一。
于是最后统计一下每个环的数量累加就好了。
统计变换环就是将同组的两个人用并查集合并一下,如果本来就是一对cp,则相当于没合并,如果是不同编号的cp,那么就是代表这两个匹配错了,要跟另一组情侣换回来。这是把一对情侣看作一个 dsu 中的节点的方式。
其实把分的每一组看作一个节点似乎也是没有问题的。
同样可以用 BFS 的方式来实现,只是感觉 dsu 更好写些。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int f[200005],n,num[200005],sz[200005];
ll ans=0;
bitset<200005>vis;
void init()
{
for(int i=1;i<=n;i++)
{
f[i]=i;
sz[i]=1;
}
}
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);
if(fx!=fy)
{
f[fx]=fy;
sz[fy]+=sz[fx];
}
}
int main()
{
freopen("twist.in","r",stdin);
freopen("twist.out","w",stdout);
cin>>n;
init();
for(int i=1;i<=2*n;i++)
{
cin>>num[i];
num[i]=(num[i]+1)/2;
}
for(int i=1;i<=2*n;i+=2)
{
combine(num[i],num[i+1]);
}
for(int i=1;i<=n;i++)
{
int fa=findf(i);
ans+=(!vis[fa])*(sz[fa]-1);
vis[fa]=1;
}
cout<<ans;
return 0;
}
后寄
赛后突然发现好像可以直接暴力做,找到不配对的情侣就交换就行了,反正操作数最多 \(2*10^5\) ,开个桶统计个下标就切了。
并查集感觉可以绿,但这直接暴力修改就只有橙了啊。
我是傻逼。
Leetcode 765 情侣牵手 / Hetao-013 翅膀打结 题解 [ 黄 ] [ 并查集 ] [ BFS ] [ 贪心 ]的更多相关文章
- Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
765. 情侣牵手 N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 ...
- Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)
Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...
- 765. 情侣牵手 (Hard)
问题描述 765. 情侣牵手 (Hard) n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手. 人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID. ...
- leetcode 886. 可能的二分法(DFS,染色,种类并查集)
题目链接 886. 可能的二分法 题意: 给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 ...
- C#LeetCode刷题-并查集
并查集篇 # 题名 刷题 通过率 难度 128 最长连续序列 39.3% 困难 130 被围绕的区域 30.5% 中等 200 岛屿的个数 38.4% 中等 547 朋友圈 45.1% ...
- 【LeetCode】并查集 union-find(共16题)
链接:https://leetcode.com/tag/union-find/ [128]Longest Consecutive Sequence (2018年11月22日,开始解决hard题) 给 ...
- 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...
- Leetcode 137. 只出现一次的数字 II - 题解
Leetcode 137. 只出现一次的数字 II - 题解 137. Single Number II 在线提交: https://leetcode.com/problems/single-numb ...
- Leetcode之并查集专题-684. 冗余连接(Redundant Connection)
Leetcode之并查集专题-684. 冗余连接(Redundant Connection) 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2 ...
- [LeetCode] 765. Couples Holding Hands 情侣牵手
N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum numb ...
随机推荐
- 同步工具之Vector
官网: https://vector.dev/ 用于构建可观察性管道的轻量级.超快速工具 [安装] curl --proto '=https' --tlsv1.2 -sSf https://sh.ve ...
- MySQL之sql_mode
sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这 ...
- BitLocker驱动器加锁和解锁
应用场景: 单位配备给你使用的电脑(Win10系统),偶尔也会有其他人使用.你可以设置某一个磁盘为你的私密数据存储空间,只有你输入密码后才能进入磁盘.即使系统重装.硬盘被拆下来挂载到其他机器上,没有密 ...
- noip2024
NOIP2024 游记 考试之前一直有很多话想在游记里说,但考完后又不知道该说些什么.这六个月的集训时光仿佛像一场梦一般. 怒砍\([60, 100] + 0 + 0 + 0\) 作为一个只学了不到一 ...
- 《JavaScript 模式》读书笔记(8)— DOM和浏览器模式1
在本书的前面章节中,我们主要集中关注于核心JavaScript(ECMAScript),而并没有太多关注在浏览器中使用JavaScript的模式.本章将探索一些浏览器特定的模式,因为浏览器是使用Jav ...
- (三)Springboot + vue + 达梦数据库构建RBAC权限模型前后端分离脚手架保姆级教程(前端项目)
XX后台管理系统 1.技术选型与环境要求 1.1 项目技术选型 1.1.1 前端技术 HTML 5 CSS 3 lavaScript Vue Element UI 1.1.2 后端技术 SpringB ...
- C++ builder 10.2 x64程序使用typeid获取vcl类名时异常
C++ builder 10.2 x64程序使用typeid获取vcl类名时异常 比如: const std::type_info &t= typeid(TForm1); 那么t的name() ...
- DDCA —— 片上网络互联
1. 路由 1.1 网络拓扑示例 Grid(网格) 网络拓扑通常是一个二维矩阵形式,每个节点(处理器)与其上下左右相邻的节点相连. 如果节点在边缘,某些方向上可能没有相邻节点(边界节点). Torus ...
- Web components vs. React
Web components vs. React - LogRocket Blog Web Components + Compose 是一条更好的路线. 当然,像 molecule 一样用 HTML ...
- 【Java】【SpringBoot】CP02:单元测试
This article is written by Xrilang(Chinese Name:萌狼蓝天) If you want find me ,You can contact me in Bil ...