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 ...
随机推荐
- stylus图床
- scikit-learn中的Pipeline:构建高效、可维护的机器学习流程
我们使用scikit-learn进行机器学习的模型训练时,用到的数据和算法参数会根据具体的情况相应调整变化, 但是,整个模型训练的流程其实大同小异,一般都是加载数据,数据预处理,特征选择,模型训练等几 ...
- Windows系统安装使用Scoop包管理器
前言 Scoop是Windows的命令行安装程序. 如果用过Linux系统,使用apt-get工具安装过软件,或者用过Python,知道pip工具用于管理Python各种依赖包,那么理解Sco ...
- 拿到小米 Offer,却迷茫了。。
大家好,我是程序员鱼皮,12 月了,很多小伙伴也拿到了秋招的 Offer(没拿到也不要灰心),但即使拿到 Offer,可能还会有一些其他的顾虑.今天分享我们编程导航一位鱼友的提问,给大家作为学习成长的 ...
- Visual Studio 使用IISprofile进行远程部署
- OSG开发笔记(三十九):OSG中模型的透明度实现、球体透明度Demo
前言 在OSG中,对于一些效果未被选中或者包含等业务,需要半透明效果来实现. 本篇描述OSG的半透明实现方式. Demo 透明 功能概述 透明效果在三维场景中扮演着重要角色,它 ...
- 服务迁移之《tomcat性能优化》
删除无用的connector,因为一般的tomcat前面都会挂有nginx服务 增加connnector使用的线程池的数量 删除没有用的listener host优化项:autoDeploy设置为fa ...
- metasploit扫描mysql空密码
靶机IP 192.168.255.100 攻击机IP 192.168.255.200 流程开始 查找mysql登录模块 msf5 > search mysql_login 加载这个模块 msf5 ...
- docker 1.13版本修改默认存储路径及添加私有registry
1.服务器安装dockeryum install docker -y12.修改配置文件方法1: 编辑 `/etc/sysconfig/docker`文件 修改`OPTION`选项 添加 --insec ...
- Qt编写地图综合应用14-离线地图下载
一.前言 网上其实有很多各种各样的离线地图下载器,大部分都是要收费的,免费的要么是限制了下载的瓦片数量或者级别,要么是下载的瓦片图打上了水印,看起来很难看,由于经常需要用到离线地图,摆脱这个限制,特意 ...