经典的连通块题,幸好我之前在 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 ] [ 贪心 ]的更多相关文章

  1. Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)

    765. 情侣牵手 N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 ...

  2. Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)

    Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...

  3. 765. 情侣牵手 (Hard)

    问题描述 765. 情侣牵手 (Hard) n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手. 人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID. ...

  4. leetcode 886. 可能的二分法(DFS,染色,种类并查集)

    题目链接 886. 可能的二分法 题意: 给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 ...

  5. C#LeetCode刷题-并查集

    并查集篇 # 题名 刷题 通过率 难度 128 最长连续序列   39.3% 困难 130 被围绕的区域   30.5% 中等 200 岛屿的个数   38.4% 中等 547 朋友圈   45.1% ...

  6. 【LeetCode】并查集 union-find(共16题)

    链接:https://leetcode.com/tag/union-find/ [128]Longest Consecutive Sequence  (2018年11月22日,开始解决hard题) 给 ...

  7. 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

    洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...

  8. Leetcode 137. 只出现一次的数字 II - 题解

    Leetcode 137. 只出现一次的数字 II - 题解 137. Single Number II 在线提交: https://leetcode.com/problems/single-numb ...

  9. Leetcode之并查集专题-684. 冗余连接(Redundant Connection)

    Leetcode之并查集专题-684. 冗余连接(Redundant Connection) 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2 ...

  10. [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 ...

随机推荐

  1. Linux防火墙工具之firewall

    CentOS7 的防火墙配置跟以前版本有很大区别,CentOS7这个版本的防火墙默认使用的是firewall,与之前的版本Centos 6.x使用iptables不一样 一.iptables防火墙1. ...

  2. 一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia

    前言 最近发现DotNetGuide技术社区交流群有不少小伙伴在学习Avalonia,今天大姚给大家分享一款开源.免费.美观的 Avalonia UI 原生控件库:Semi Avalonia. Ava ...

  3. C++ 实现万年历(原创)

    2020年08月31日 首次分享文档源代码. 2023年11月23日 对文档.代码进行了更新,希望可以帮助到你. 1. 实现功能 提供菜单方式选择,假定输入的年份在1940-2040年之间. 输入一个 ...

  4. Sealos Devbox 基础教程:使用 Cursor 从零开发一个完整的项目

    作者:熊猫Jay,上市公司技术负责人,破局AI 提示词.AI编程教练.通往AGI之路内容共创者 最近发现身边越来越多人尝试用 Cursor 写代码.开发小产品了. 如果想要实现商业化或引流,我们的小工 ...

  5. 零基础学习人工智能—Python—Pytorch学习(十)

    前言 本文的内容是来自教程视频的第十五集,个人感觉,这个教程是有点虎头蛇尾,就是前面开始的教程,是非常惊人的好,但到这里,就有点水了,可以说就是把代码一铺,然后简单介绍一遍,很多细节都没有讲,所以,我 ...

  6. 简化 ASP.NET Core 依赖注入(DI)注册-Scrutor

    简化 ASP.NET Core 依赖注入(DI)注册-Scrutor Scrutor 是一个开源库,旨在简化 ASP.NET Core 应用程序中依赖注入(DI)的注册过程.通过自动扫描程序集中的类型 ...

  7. oracle查询某个sql语句客户端ip地址

    1. 背景 业务出现异常后,或者某个sql导致系统卡顿.需要问题后需要溯源,需要获取这个sql是在哪个客户端的IP发起的. 2. cs架构 客户端直接连接数据库,可以很方便查询,采用通过sql_id找 ...

  8. less 常用方法

    介绍 Less 是 CSS 的预处理语言之一,为 CSS 增添了变量.Mixin.函数等特性,使CSS更易于维护扩展. 嵌套(Nesting) .header { .navgation: { font ...

  9. 中电金信:“人工智能+”首次写入政府工作报告,各大企业何以破局AI模型挑战

    ​2024年全球新一轮技术变革加速来临,大模型作为人工智能发展的核心引擎,正引发一场全新的工业革命.今年全国两会期间,人工智能成为最热话题之一."人工智能+"首次被写入政府工作报告 ...

  10. [转载] 十问 TiDB :关于架构设计的一些思考 TiDB

    做 TiDB 的缘起是从思考一个问题开始的:为什么在数据库领域有这么多永远也躲不开的坑?从 2015 年我们写下第一行代码,3 年以来我们迎面遇到无数个问题,一边思考一边做,尽量用最小的代价来快速奔跑 ...