首页 > 其他分享 >CF1994D-鸽巢原理

CF1994D-鸽巢原理

时间:2024-08-05 18:18:10浏览次数:7  
标签:操作数 int CF1994D vector vec 鸽巢 原理

CF1994D-鸽巢原理

大致题意

Vanya 有一个图,图中有 n 个顶点(编号从 1 到 n )和 a 个由 n 个整数组成的数组;最初,图中没有边。万尼亚觉得无聊,为了找点乐子,他决定进行 n−1 次运算。

操作数 x (操作数从 1 开始依次编号)如下:

  • 选择 2 个不同的数 1≤u,v≤n ,使得$ |a_u−a_v| $可以被 x 整除。
  • 在顶点 u 和 v 之间添加一条无向边。

使用 n−1 运算帮助Vanya得到一个连通的图,或者确定这是不可能的。

  • 如果沿着边可以从任何顶点到达其他顶点,那么这个图就叫做连通图。

解题思路

首先介绍鸽巢原理

鸽巢原理:将n+1个物品划分为n组,那么至少有一组有两个(及以上)的物品

推广:将n个物品划分为k组,那么至少有一组有\(\lceil{\frac{n}{k}}\rceil\)个物品

对于本题,我们考虑操作的条件:$|a_u−a_v|%x==0 $,对于两个数如果他们对同一个数字取模余数相同,那么就会满足该条件

于是我们可以考虑将所有数字对操作数x取模,由于对于操作数1来说它的可使用边是最多的,而操作n-1使用边是最少的,所以我们优先逆序操作,将所有数字按照对x取余分组

根据鸽巢原理,至少有一组中包含两个或两个以上的数字,那么我们就可以将这两个数字进行连边,连完后需要删除其中一个数。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
void solve()
{
	int n;
	cin>>n;
	vector<int> a(n+1),vis(n+1);
	vector<pair<int,int>> edg;
	for(int i = 1;i <= n;++i) cin>>a[i];
	for(int i = n-1;i>=1;--i)
	{
		vector<vector<int>> vec(i);
		for(int j = 1;j<=n;++j)
		{
			if(!vis[j])
			{
				vec[a[j]%i].push_back(j);
			}
		}
		for(int j = 0;j < i;++j)
		{
			if(vec[j].size()>=2)
			{
				auto u = vec[j][0],v = vec[j][1];
				edg.push_back({u,v});
				vis[v] = 1;
				break;
			}
		}
	}

	cout<<"YES"<<endl;
	reverse(edg.begin(),edg.end());
	for(auto [u,v]:edg)
	{
		cout<<u<<" "<<v<<endl;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int tt;
	cin>>tt;
	while(tt--)solve();
	return 0;
} 

标签:操作数,int,CF1994D,vector,vec,鸽巢,原理
From: https://www.cnblogs.com/empty-y/p/18343733

相关文章

  • BMTrain类Megatron+DeepSpeed原理学习
    这一章节虽然是BMTrain,不是目前常用的Megatron+DeepSpeed,但是对于了解原理,也是很有帮助。BMTrain数据并行一般数据并行上图,把数据切为3份,每张显卡处理一部分数据,每张显卡利用得到的数据进行前向传播和反向传播,得到各自的梯度,为了让模型学到这份数据的所有知识,就需要......
  • 一文了解读懂系列:5G连接模式DRX-原理篇
    一、引言与LTE类似,5G中的不连续接收(DRX)分为两种类型:空闲模式DRX和连接模式DRX。在空闲模式DRX中,用户设备(UE)会定期唤醒以监测寻呼消息,如果寻呼消息不是针对它的,则会回到休眠模式。本文将详细讨论5GNR的连接模式DRX。如果在5GNR或LTE中没有连接模式DRX,UE必须始终保持清醒......
  • springboot自学(6)springboot核心原理
    Springboot启动流程初始化各种属性,加载成对象  读取环境属性(Environment)  系统配置(spring.factories)  参数(Arguments、application.properties)创建Spring容器对象ApplicationContext,加载各种配置在容器创建前,通过监听器机制,应对不同阶段加载数据、更新数据的要求......
  • 补充:关于GRU的详细运作原理以及特殊的优化思路
    1.GRU的基本结构和运作原理1.1GRU的基本概念GatedRecurrentUnit(GRU)是一种简化版的循环神经网络(RNN),它通过引入门控机制来解决长期依赖问题,同时减少参数数量以降低计算复杂度。1.2GRU的结构详解GRU包含两个门控机制:更新门(updategate)和重置门(resetgat......
  • 软件工程专业导论大作业-关于华为自主研发的新编程语言基本原理其应用场景分析
    摘 要在2024年6月21日的华为开发者大会上,华为宣布了其自主研发的全新编程语言——“仓颉”。这一语言的推出旨在为其“升腾”AI芯片和云原生应用开发提供强大支持,并且有助于构建全球技术生态系统。“仓颉”编程语言特别设计以应对华为“升腾”AI芯片的需求,并且专注于硬件和......
  • ThreadLocal原理(二)
    ThreaddLocal源码方法不是很多,主要有get()方法,set(Tvalue)方法,remove()方法,initialValue()方法.set(Tvalue)方法set方法用于设置线程本地变量的值.源码如下.publicvoidset(Tvalue){//获取当前线程Threadt=Thread.currentThread();/......
  • 套接字编程之socket的原理
    所谓套接字,其实就是socketsocket是干嘛用的呢?当我们写一个C/S架构的软件时,是需要实现客户端与服务端之间的网络通信的,不然你的客户端怎么和服务端建立连接呢?这个socket就是负责干这个事的。还记得OSI七层协议吗?如果是计算机科班出身的同学一定学过这个,没关系,哥带你回顾下到底什......
  • 1388、STM32单片机心率(脉搏)MAX30102血氧体温检测阈值报警无线蓝牙远程(程序+原理图+
    毕设帮助、开题指导、技术解答(有偿)见文未 目录方案选择单片机的选择显示器选择方案一、设计功能二、实物图三、原理图四、程序源码五、PCB图六、proteus仿真程序流程图:原理图文字讲解:参考论文:资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩......
  • 1386、STM32单片机心率(脉搏)体温检测阈值设置报警无线蓝牙远程设计(程序+原理图+PCB
    毕设帮助、开题指导、技术解答(有偿)见文未 目录方案选择单片机的选择显示器选择方案一、设计功能二、实物图三、原理图四、程序源码五、PCB图六、proteus仿真程序流程图:原理图文字讲解:参考论文:资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩......
  • 基于OpenCV C++的网络实时视频流传输——Windows下使用TCP/IP编程原理
    1.TCP/IP编程1.1概念IP是英文InternetProtocol(网络之间互连的协议)的缩写,也就是为计算机网络相互连接进行通信而设计的协议。任一系统,只要遵守IP协议就可以与因特网互连互通。所谓IP地址就是给每个遵循tcp/ip协议连接在Internet上的主机分配的一个32bit地址。按照TC......