AtCoder Beginner Contest 399(c,d)

news/2025/4/1 19:50:24/文章来源:https://www.cnblogs.com/fufuaifufu/p/18800821

比赛链接
c题目描述
给定一个具有 N 个顶点和 M 条边的简单无向图,顶点编号从 1 到 N,第 i 条边连接顶点 (u_i) 和 (v_i)。需要计算从该图中删除最少多少条边,才能使图变成一个森林(即不包含任何环的简单无向图)。
代码思路
本题使用并查集(Disjoint Set Union,DSU)来解决。并查集是一种用于处理不相交集合的合并与查询问题的数据结构,非常适合用于判断图中是否存在环。具体思路如下:
初始化并查集:为每个顶点创建一个独立的集合,每个集合的父节点初始化为自身。
遍历每条边:对于每一条边 ((u, v)),检查 u 和 v 是否属于同一个集合。

  • 如果 u 和 v 不属于同一个集合,说明这条边不会形成环,将这两个集合合并。
  • 如果 u 和 v 属于同一个集合,说明这条边会形成环,需要将其删除,记录删除边的数量。

输出结果:遍历完所有边后,输出需要删除的边的数量。代码实现

#include <iostream>
#include <vector>
using namespace std;// 查找元素 x 所在集合的根节点,并进行路径压缩
int find(int x, vector<int>& parent) {if (parent[x] != x) {parent[x] = find(parent[x], parent);  // 路径压缩}return parent[x];
}// 合并元素 x 和 y 所在的集合
void unionSet(int x, int y, vector<int>& parent, vector<int>& rank) {int rootX = find(x, parent);int rootY = find(y, parent);if (rootX != rootY) {if (rank[rootX] > rank[rootY]) {parent[rootY] = rootX;} else if (rank[rootX] < rank[rootY]) {parent[rootX] = rootY;} else {parent[rootY] = rootX;rank[rootX]++;}}
}int main() {int N, M;cin >> N >> M;vector<int> parent(N + 1), rank(N + 1, 0);for (int i = 1; i <= N; i++) {parent[i] = i;  // 初始化并查集}int deleteCount = 0;for (int i = 0; i < M; i++) {int u, v;cin >> u >> v;if (find(u, parent) != find(v, parent)) {unionSet(u, v, parent, rank);} else {deleteCount++;  // 如果已连接,说明是环,记录删除}}cout << deleteCount << endl;return 0;
}

d问题分析
我们需要找到满足以下条件的整数对 (a, b) 的数量:
a 和 b 的两个出现位置在原数组中均不相邻。
通过交换 a 和 b 的位置,可以使 a 和 b 的两个出现位置均相邻。
关键观察:当且仅当 a 和 b 的两个出现位置形成两个独立的相邻对时,交换操作可以满足条件。例如,位置序列为 ...a, b, ..., a, b... 或 ...a, b, ..., b, a...,此时交换后 a 和 b 的两个位置均相邻。
方法思路
预处理位置:记录每个数字的两个出现位置。
遍历相邻元素:对于每对相邻元素 (a, b),检查它们的位置是否满足条件。
条件验证:收集四个位置并排序,检查是否形成两个独立的相邻区间。
去重存储:使用集合存储有效对,避免重复计数。
解决代码

#include <algorithm>
#include <iostream>
#include <set>
#include <vector>
using namespace std;int main() {int T;cin >> T;while (T--) {int N;cin >> N;vector<int> A(2 * N);for (auto& a : A) cin >> a;vector<vector<int>> position(N + 1);for (int i = 0; i < 2 * N; i++) {position[A[i]].push_back(i);}set<pair<int, int>> answers;for (int i = 0; i < 2 * N - 1; i++) {int a = A[i], b = A[i + 1];if (a == b) continue;// 检查a和b的两个位置是否不相邻if (position[a][0] + 1 == position[a][1] ||position[b][0] + 1 == position[b][1]) {continue;}// 收集四个位置并排序vector<int> v{position[a][0], position[a][1],position[b][0], position[b][1]};sort(v.begin(), v.end());// 检查是否满足条件if (v[0] + 1 == v[1] && v[2] + 1 == v[3]) {answers.emplace(min(a, b), max(a, b));}}cout << answers.size() << "\n";}return 0;
}

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

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

相关文章

CDR-文档操作

CDR的文档、视图、对象的基本操作--本篇导航--文档操作(新建、保存、导出) 视图操作(缩放、移动) 对象操作(移动、旋转、缩放、复制、颜色) 编辑工具栏 辅助线界面及工作流程 工作流程:新建文档,在文档中输入文字、图形、或导入外部的图片做排版,可新建多个页面,保存…

1010 图之图

\(因为题解感觉已经很周到了仅为不懂根号分治复杂度的做一个补充\) \(就是反向插入边时这样的点最多有m/lim个 那么平均到每个位置所贡献的压力也为m/lim\)#include<bits/stdc++.h> #define int long long #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),…

Linux系统ubuntu20.04 无人机PX4 开发环境搭建

安装Ubuntu对应版本的Ros 此处省略 PX4固件下载PX4的源码处于GitHub,因为众所周知的原因git clone经常失败,此处从Gitee获取PX4源码和依赖模块。git clone https://gitee.com/voima/PX4-Autopilot.git使用cd命令切换到 px4项目文件目录:cd ~/PX4-Autopilot #切换到1.14.0分支…

jmeter性能测试(2)——插件和nmon

一、性能插件认识1.在jmeter中添加性能插件2.下载两个jar包和启动包3.存放路径 (1)路径1(2)启动插件(4)将所有插件添加到线程中 常用的性能指标插件 1. jp@gc - Bytes Throughput Over Time:不同时间吞吐量展示(图表) 聚合报告里,Throughput是按请求个数来展示的,比如…

jmeter性能测试(2)——实战

一、单接口性能测试(同一用户进行压力测试)POST http://49.233.201.254:8080/cms/manage/loginJump.do POST data:userAccount=admin&loginPwd=123456按100 压力测试(1)在线程中修改虚拟用户数线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数…

2025全国青少年信息素养大赛报名指南(内附报名全流程)

2025全国青少年信息素养大赛报名指南 (内附报名全流程)2025 年预估初赛在 28 万~32 万人次左右,今年竞争会比较激烈,大家提前备考,NOI官网发布了“关于参加CSP-J/S认证需符合年龄条件的公告”,报名参加CSP-J/S的被认证者在当年9月1日(不含)需满12周岁,包括第一轮和第…

Codeforces Round 1013 (Div. 3)(前5)

比赛链接 A:Olympiad Date 让我们开始一个数字计数器 cnt[i] ( 0≤i≤9) 3≤cnt[0],1≤cnt[1],2≤cnt[2], 1≤cnt[3],1≤cnt[5] 答案已找到。如果在计算所有数字之后,没有满足其中一个条件,则没有解决方案,答案为 0. 代码如下 #include <bits/stdc++.h> using namesp…

【题解】E - Replace

背景 这把报了 UnRated 从 E 开始看,于是非常惨烈的只拿下了 E。这个 2054 难度的题居然只有绿。E - Replace 题意 给你两个字符串 \(s,t\),你每次可以把 \(s\) 中的一种字符换成另一种,求把 \(s\) 变成 \(t\) 的最小操作数,可能无解。 思路 我们先考虑无解怎么判:可以得到…

质数筛——欧拉筛

欧拉筛 核心思想 和数只被它最小的质因数筛去 prime_number是当前小于i的所有质数集合 p是prime_number的元素,当没有找到最小质因数pi时,p是j的最小质因数,j可以被筛去,当找到最小质因数时就要退出循环,否则不能保证p是j的最小质因数 算法的时间复杂度:O(n),到n的所有和…

索引的分类

远离那些贬低你理想的人。狭隘的人经常如此,伟大的人会让你感觉自己也可以变好。 ——马克吐温按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引) 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀…

Linux基本使用-3

常用快捷键使用ctrl + c ==> 强制停止,结束当前命令运行或清空已输入命令ctrl + d ==> 退出登出,退出当前登录账户或退出程序history ==> 查看历史命令!命令前缀 ==> 自动匹配上一个命令ctrl + r ==> 搜索历史命令ctrl + a|e ==> 光…