Good Bye 2022: 2023 is NEAR D. Koxia and Game

news2024/10/5 15:34:51

原题链接:Problem - D - Codeforces

题面: 

大概意思就是给你一个数组a和数组b,你自己设计一个数组c,Koxia可以从a[i]、b[i]和c[i]中选一个,而Mahiru只能从另外两个里选一个,问你有多少个数组c一定能使Mahiru选择的数字形成一个1~n的排列。

 思路:

首先我们需要知道,a[i]、b[i]和c[i]中一定要有两个是相同的,并且Koxia必须选择那个和另外两个不同的数(或者三个数都相同了)。这是为什么呢?因为若a[i]、b[i]和c[i]都是不相同的,那么Mahiru的选择的数就不是固定的了,这样就肯定形成不了排列。所以我们要让Mahiru的选择固定下来。

为了使得Mahiru的选择固定下来,三个数中则至少有两个数是一样的,这样子Koxia就可以选择那个不同的数,使得Mahiru的选择固定了。而若a[i]和b[i]原本就一样的话,c[i]可以选任何值,对方案的贡献值为*n,若不一样的话,则c[i]只能等于a[i]或者b[i]。对方案的贡献值可能为*2。为什么是可能呢?因为有时候并不是两个选择都能有相应的答案。

我们在点a[i]与点b[i]之间连一条边,若d能是一个排列,则每个结点都能被恰好被指一次,每个边只能指向一个节点。

以题目中的样例来打个比喻:

3

1 2 2

1 3 3

可以画成下面这样的图

 对于结点2、3,我们有两种选法使得每个结点都能被恰好被指一次

 

所以对于结点2、3我们有两种选法,而且结点1是一个自环,c[1]在1~3中都可以选,所以对于样例一,我们总共有3*2=6种选法。

而样例中的:

5

3 3 1 3 4

4 5 2 5 5

可以这样画:

它肯定没有解,这是为什么呢?因为1和2都不可能都选到。相信有一部分同学已经看出来了,若有解,则每个连通块都必须有一个环,也就是每个联通块不能有两个及以上的环(因为若一个连通块形成不了环了,那必然会有某个连通块会多出环来)。

最后在有解的情况下,若结点a[i]=b[i],则方案数*n,因为c[i]无论怎么选都不会使得本来有解的情况变成无解,所c[i]可以在1~n中任选。若结点a[i]!=b[i],则看a[i]和b[i]是否在一个环中,若在一个环中,就说明我们可以在这个环中逆时针选一次,顺时针选一次,方案数*2。若无环则方案数不变。

using mint = simpler::modint<998244353>;
int find(int x) {
	return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void solve() {
	mint ans = 1;
	int n;
	cin >> n;
	FOR(1, n) fa[i] = i, cnt[i] = 0;
	FOR(1, n) cin >> a[i];
	FOR(1, n) cin >> b[i];
	FOR(1, n) {
		int fx = find(a[i]), fy = find(b[i]);
		if (a[i] == b[i]) ans *= n, cnt[fy]++;//若形成自环则方案数*n
		else if (fx == fy) ans *= 2, cnt[fy]++;//若形成环了则方案数*2 
		else  fa[fx] = fy, cnt[fy] += cnt[fx];//若无环则方案数不变 
		if (cnt[fy] > 1) {//判断是否形成了两个及以上的环
			cout << 0 << endl;
			return;
		}
	}
	cout << ans << endl;
}

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

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

相关文章

给GitHub装扮个性化首页

我的主页 如何配置 需要创建一个仓库&#xff0c;仓库名要跟GitHub的用户名一样,我的已经创建过了 喜欢我的主页可以直接fork然后在自己的仓库修改&#xff0c;如果想自己装扮直接看下一步 地址&#xff1a;https://github.com/linweiqian 开始装扮 下面展示仓库状态统计的设…

工业控制系统安全控制应用缩略语汇总

声明 本文是学习GB-T 32919-2016 信息安全技术 工业控制系统安全控制应用指南. 下载地址 http://github5.com/view/585而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 工业控制系统安全控制应用缩略语 ICS 工业控制系统&#xff08;Industrial Contro…

线程的高效利用——线程池

文章目录线程的开销线程池的工作方式ThreadPoolExecutor基础线程池结果的处理线程的开销 线程作为一种昂贵的资源&#xff0c;开销包括如下几点&#xff1a; 1、线程的创建与启动的开销。 2、线程的销毁的开销。 3、线程调度的开销。线程的调度会产生上下文切换&#xff0c;从…

skywalking解析-入门

前几天从github上看最近比较火的项目&#xff0c;发现了skywalking&#xff0c;就进行了些了解&#xff0c;发现这个领域自己目前知之甚少&#xff0c;打算通过对源码的分析深入了解一下分布式追踪。首先从对skywalking介绍开始。 目录一、简介二、整体架构三、源码下载四、系统…

spark-RDD学习笔记

本文是19年学生时学习林子雨老师课程中的一些学习笔记&#xff0c;主要内容包括RDD的概念和运行原理,rdd相关编程api接口以及对应的实例。关于RDD的内容&#xff0c;这个笔记描述的2019年年底之前的pyspark版本&#xff0c;2023年年初时在pyspark的实际工作中rdd已经很少用或者…

【Kafka】Kafka概述

一、闲话 这是2023年的第一篇博客&#xff0c;祝大家在新的一年里一帆风顺&#xff0c;身体健康 二、基本要点 1、Kafka概述 Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue)&#xff0c;主要用于大数据实时处理领域 2、消息队列的好处 解耦&#xff1a;…

CAS原理、实践、缺陷分析及优化

文章目录CAS介绍CAS在Java中的底层实现Java源码中使用举例自己实际运用乐观锁举例简单的CAS操作ABA问题及优化实践缺陷及优化只能保证单个变量操作原子性当比较失败后,通常需要不断重试,浪费CPUCAS介绍 CAS(Compare And swap),比较并交换,是一种乐观锁.它是解决多线程并行情况…

【力扣Java】第一个出现两次的字母(HashSet与<<左移)

目录 题目描述 思路与算法 方法一&#xff1a;哈希表 HashSet说明 解题代码 方法二&#xff1a;位运算 左移运算符&#xff08;<<&#xff09; 右移运算符&#xff08;>>&#xff09; 解题代码 题目描述 给你一个由小写英文字母组成的字符串 s &#xff…

事务四大特性

没有开启事务的话直接提交、修改数据&#xff0c;有事务则进行两阶段提交&#xff1a; ①原子性 undolog 来实现一旦失败就马上触发回滚 当前事务是不可再分的&#xff0c;要么一起执行&#xff0c;要么都不执行。 start transaction redolog日志池存储undolog日志&#xff…

【Android OpenCV】Visual Studio 创建支持 OpenCV 库的 CMake 工程 ④ ( OpenCV 官方代码示例 )

文章目录一、OpenCV 官方代码示例1、Windows 平台代码示例2、Android 平台代码示例参考 【Android OpenCV】Visual Studio 创建支持 OpenCV 库的 CMake 工程 ① ( 下载 OpenCV 库 | Windows 中安装 OpenCV 库 ) 博客 , 可下载 OpenCV 库 ; CSDN 下载地址 : https://download.c…

educoder数据结构 字符串匹配 第2关:实现KMP字符串匹配

本文已收录于专栏 &#x1f332;《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》&#x1f332; 任务描述 本关的编程任务是补全 step2/kmp.cpp 文件中的KmpGenNext函数&#xff0c;以实现 KMP 字符串匹配。该函数生成给定字符串的next数组。 相关知识 第 1 关中实现…

LEETCODE 19. 删除链表的倒数第 N 个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&#xff1a;…

shell流程控制之条件判断练习案列

练习案例1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。2、判断web服务是否运行&#xff08;1、查看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行…

memcpy与memmove函数的区别和实现

1.函数定义 memcpy与memmove都是C语言的库函数&#xff0c;在头文件string.h中&#xff0c;作用是内存拷贝。唯一的区别是&#xff0c;当内存发生局部重叠时&#xff0c;memmove保证了拷贝的结果是正确的&#xff0c;但是memcopy不一定是正确的。但是memcpy比memmove速度快。 …

zookeeper学习笔记3(小滴课堂)

zk集群核心知识之三种角色及其作用&#xff1a; 注册中心的三种模式&#xff1a; 选举核心概念及选举状态&#xff1a; 选举发生的时机及选举算法&#xff1a; zookeeper集群的搭建&#xff1a; 我们先来启动三台虚拟机&#xff1a; 然后我们来修改一下我们的zookeeper配置&a…

Introducing Tome, AI讲演助手

随着ChatGPT进入人们的视野&#xff0c;AI开始在越来越多的领域大展拳脚&#xff0c;近期&#xff0c;一款名为Tome的讲演编辑工具&#xff08;类似幻灯片&#xff09;推出了AI辅助创作的功能&#xff0c; Tome的AI讲演功能可以更轻松地将文本、图像、音频等多种媒体元素融合到…

CPU缓存一致性协议MESI

目录 CPU高速缓存&#xff08;Cache Memory&#xff09; CPU为何要有高速缓存 带有高速缓存的CPU执行计算的流程 目前流行的多级缓存结构 多核CPU多级缓存一致性协议MESI MESI协议缓存状态 MESI状态转换 多核缓存协同操作 单核读取 双核读取 修改数据 同步数据…

“英雄无敌”(一)

注意&#xff1a;在阅读本文前建议观看对应的视频教程&#xff0c;本文主要作为那些对视频教程仍有疑问的学习者的参考资料。且本文的部分内容有些过时&#xff08;如仍使用旧版Unity的动画系统&#xff09;&#xff0c;故直接阅读本文对Unity的学习没有太大意义 视频教程&…

写小论文心得(计算机视觉领域)

简介 这篇博文打算讲一下我写小论文前后的过程&#xff0c;其中有许多地方我觉得对于新手来说还是有很多帮助的&#xff0c;包括我自己也是自己慢慢摸索出来的&#xff0c;希望能对正在准备自己第一篇论文的人有所帮助。 写论文的整个过程我想分为几个阶段&#xff1a; 1.获得…

【深度学习】生成对抗网络(GAN)生成海贼王图像 + PyTorch代码实现

文章目录一、数据集介绍1.1 lufei&#xff08;路飞&#xff09;1.2 luobin&#xff08;罗宾&#xff09;1.3 namei&#xff08;娜美&#xff09;1.4 qiaoba&#xff08;乔巴&#xff09;1.5 shanzhi&#xff08;山智&#xff09;1.6 suolong&#xff08;索隆&#xff09;1.7 wu…