Codeforces Round 738 (Div. 2) D2. Mocha and Diana (Hard Version)

题目

思路:

性质1:能在结点u,v添加边的充要条件是u,v在第一个图和第二个图都不连通

性质2:可以添加的边数等于 n - 1 - max(m1, m2),并且添加边的顺序不会影响结果(即 边(u,v)满足性质1,就可以直接添加,不会影响结果),证明如下:

        

对于hard version:先让所有可以与结点1连边的结点连边,然后对于结点2 ~ n,可以分为三类结点:在第一个图与结点1不连通,在第二个图与结点1连通(表示为01)、10 、11,(不存在00,若存在00,那么这个结点就会与结点1连边,变成11)。11的结点不能再连边,对答案无贡献,可以忽略;01的结点u可以与10的结点v连边,注意添加边(u,v)后,原本和u在第一个图中同一个连通块的结点(原本整个连通块的结点都是01)都会变成11,同理v在第二个图中所在连通块也是变成11,故对于每个连通块只找最高级祖先来连边。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 1e6 + 5, inf = 1e18, maxm = 4e4 + 5;
const int N = 1e6;
const int mod = 1e9 + 7;
// const int mod = 998244353;
//const __int128 mod = 212370440130137957LL;
//  int a[1005][1005];
// bool vis[505][505];
int n, m;
int a[maxn];
int b[maxn];
string s;struct DSU{vector<int> fa, siz;DSU(int n) : fa(n), siz(n, 1) {for(int i = 0; i < n; i++){fa[i] = i;}}int find(int x){if(x == fa[x]) return x;return fa[x] = find(fa[x]);}void merge(int u, int v){if(find(u) != find(v)){fa[find(u)] = find(v);}}
};
// struct Node{
//     int a, b;
//     // int val, id;
//     bool operator<(const Node &u)const{
//         
//     }
// }node[maxn];//long long ? maxn ? n? m?
void solve(){int res = 0;int k;int m1, m2;cin >> n >> m1 >> m2;int u, v;DSU t1(n + 5), t2(n + 5);for(int i = 1; i <= m1; i++){cin >> u >> v;t1.merge(u, v);} for(int i = 1; i <= m2; i++){cin >> u >> v;t2.merge(u, v);} res = n - 1 - max(m1, m2);cout << res << '\n';for(int i = 2; i <= n; i++){if(t1.find(i) != t1.find(1) && t2.find(i) != t2.find(1)){t1.merge(i, 1);t2.merge(i, 1);cout << 1 << ' ' << i << '\n';}}vector<int> vec[2];for(int i = 2; i <= n; i++){if(t1.find(i) != t1.find(1) && t1.find(i) == i){//01类的结点且是该连通块的最高级祖先 vec[0].pb(i);}if(t2.find(i) != t2.find(1) && t2.find(i) == i){//10类的结点且是该连通块的最高级祖先vec[1].pb(i);}}for(int i = 0; i < min(vec[0].size(), vec[1].size()); i++){cout << vec[0][i] << ' ' << vec[1][i] << '\n';}
}   signed main(){ios::sync_with_stdio(0);cin.tie(0);int T = 1;
//    cin >> T;while (T--){solve();}return 0;
}
?

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

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

相关文章

极客时间 - Django快速开发实战

Django快速开发实战 能够使用Django Admin快速搭建管理后台掌握Django管理后台的深度定制方法&#xff0c;能够添加定制的功能Django中间件的工作原理&#xff0c;能够自己设计实现一个中间件能够使用Django快速为企业现有系统搭建管理后台精益创业的产品思维&#xff0c;结合…

【25届秋招备战C++】23种设计模式

【25届秋招备战C】23种设计模式 一、简介程序员的两种思维8大设计原则 二、具体23种设计模式2.1 创建型模式2.2 结构性模式2.3 行为型模式 三、常考模式的实现四、参考 一、简介 从面向对象谈起&#xff0c; 程序员的两种思维 底层思维:向下 封装&#xff1a;隐藏内部实现 多…

DRF视图基类使用方法

【 一 】drf之请求 请求对象Request 【 0 】前言 ​ 在 Python 中&#xff0c;通常通过 request 对象来处理 HTTP 请求&#xff0c;尤其是在 web 开发中&#xff0c;比如使用 Django、Flask 等框架时会经常接触到这个对象。request 对象是框架提供的&#xff0c;用于封装客户…

【C++】二叉搜索树(手撕插入、删除、寻找)

一、什么是二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左…

[前端异步]循环中所有异步任务完成才往下运行?

reqData(){this.startLoading();//获取分析结果数据for (let i 1; i <24;i 1) {try {let formattedValue i.toString().padStart(4, 0);this.requestData(formattedValue).then((PromiseResult) > {if(PromiseResult.status"success"){this.images.push(Pro…

hadoop学习---基于Hive的聊天数据分析报表可视化案例

背景介绍&#xff1a; 聊天平台每天都会有大量的用户在线&#xff0c;会出现大量的聊天数据&#xff0c;通过对聊天数据的统计分析&#xff0c;可以更好的对用户构建精准的用户画像&#xff0c;为用户提供更好的服务以及实现高ROI的平台运营推广&#xff0c;给公司的发展决策提…

C++:AVL树

概念&#xff1a; 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。 如图所示&#xff0c;搜索二叉树不能面对右边的树&#xff0c;这种极端的情况&#xf…

JavaScript创建数组对象的两种方式

JavaScript创建数组对象的两种方式有以下两种&#xff1a; 使用数组字面量语法&#xff08;Array Literal Syntax&#xff09;: 使用方括号([])来定义一个新的数组&#xff0c;可以在方括号中添加元素&#xff08;以逗号分隔&#xff09;。 例如&#xff1a; let array1 []; /…

vue引入vuex

Vuex 是 Vue.js 的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。以下是 Vue 中使用 Vuex 的详细步骤&#xff1a; 安装 Vuex&#xff1a; 如果你还没有安装 Vuex&#xff0c;可以通过 npm 或 ya…

利用Github发现优质的学习项目网址

1. 直接搜索&#xff0c;star的数量越多的项目质量越高 2.Github Trending 地址: https://github.com/trending 3. Gitstar Ranking 地址: https://gistar-ranking.com/ 4. Awesome Topic 地址: https://github.com/topics/awesome

[附源码]秦时明月6.2魔改版_搭建架设教程_附GM工具_安卓苹果

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 一. 演示视频 秦时明…

Oracle导入数据中文乱码问题处理,修改客户端字符编码跟数据库的一致

前提&#xff1a;SQL文件打开其中中文字符是正常显示&#xff0c;保证导出文件中文字符正常。通过sqlplus命令导入SQL文件出现乱码&#xff0c;这是因为客户端跟数据库的字符集不一致导致出现乱码问题。 要SQL导入的中文正常&#xff0c;要确保执行导入命令的客户端字符编码跟…

【电路笔记】-Twin-T振荡器

Twin-T振荡器 文章目录 Twin-T振荡器1、概述2、Twin-T振荡器3、Twin-T放大4、Twin-T 振荡器示例5、总结Twin-T 振荡器是另一种 RC 振荡器电路,它使用两个并联的 RC 网络来产生单一频率的正弦输出波形。 1、概述 Twin-T 振荡器是另一种类型的 RC 振荡器,它产生正弦波输出,用…

牛客 二叉树 NB1 牛群的最大高度

原题链接 就不采用, 递归的方式来做了, 自己弄个栈来做 用栈来保存路径, curr 表示当前的节点, pre 保留往回走时的上一步 如果是 用递归来做 它的栈链路是这样的, 可以做下参考 黄色表示返回 用栈模拟的话, 不可能模拟得一摸一样, 递归的话一个栈会经过3次, 第三次后就不…

医学论文摘要翻译 中译英哪里比较专业

论文摘要是对论文内容不加注释和评论的简短陈述&#xff0c;需要扼要说明论文的目的、研究方法和最终结论。在发表学术论文时&#xff0c;很多重要刊物会要求作者将文章的摘要翻译成英文。那么&#xff0c;针对医学论文摘要翻译&#xff0c;中译英哪里比较专业&#xff1f; 专…

【C++】详解STL容器之一的 vector

目录 概述 迭代器 数据结构 优点和缺点 接口介绍 begin end rbegin rend resize reseve insert erase 其他一些接口 模拟实现 框架 获取迭代器 深浅拷贝 赋值重载 reseve resize 拷贝构造 构造 析构 insert erase 其他 概述 vector是STL的容器之一。…

连接docker中的MySQL出现2058错误

出错场景&#xff1a;在虚拟机中用docker技术下载最新版本的MySQL&#xff0c;在本地电脑上连接发现出现2058错误。 解决方法&#xff1a; 按照以下步骤 1. 2. ALTER USER root% IDENTIFIED WITH mysql_native_password BY 自己MySQL的密码; 3.成功

SpringBoot启动类常用注解

1. @SpringBootApplication 这是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan注解。通常用于标记启动类。 使用@AliasFor注解定义了4个参数,分别是"exclude","excludeName","basePackages",&…

redis--安装

简介 官网&#xff1a;RedisInsight - The Best Redis GUI 各个版本官网下载地址&#xff1a;http://download.redis.io/releases/ Redis和Memcached是非关系型数据库也称为NoSQL数据库&#xff0c;MySQL、Mariadb、SQL Server、PostgreSQL Oracle 数据库属于关系型数据 应用…

为什么选择ATECLOUD自动化测试平台?

在当今飞速发展的时代&#xff0c;一切都在不断进步与变革&#xff0c;电测行业也由手动测试逐步转向了自动化测试。但是随着科技的发展&#xff0c;对于产品的测试要求也越来越高&#xff0c;传统的自动化测试系统已经无法满足用户日益增长的测试需求&#xff0c;全新的ATE测试…