GESP202412 八级【排队】题解(AC)

news/2025/3/14 1:53:00/

请添加图片描述
》》》点我查看「视频」详解》》》

[GESP202412 八级] 排队

题目描述

小杨所在班级共有 n n n 位同学,依次以 1 , 2 , … , n 1,2,\dots,n 1,2,,n 标号。这 n n n 位同学想排成一行队伍,其中有些同学之间关系非常好,在队伍里需要排在相邻的位置。具体来说,有 m m m 对这样的关系( m m m 是一个非负整数)。当 m ≥ 1 m\geq 1 m1 时,第 i i i 对关系( 1 ≤ i ≤ m 1\leq i\leq m 1im)给出 a i , b i a_i,b_i ai,bi,表示排队时编号为 a i a_i ai 的同学需要排在编号为 b i b_i bi 的同学前面,并且两人在队伍中相邻。

现在小杨想知道总共有多少种排队方式。由于答案可能很大,你只需要求出答案对 1 0 9 + 7 10^9+7 109+7 取模的结果。

输入格式

第一行,两个整数 n , m n,m n,m,分别表示同学们的数量与关系数量。

接下来 m m m 行,每行两个整数 a i , b i a_i,b_i ai,bi,表示一对关系。

输出格式

一行,一个整数,表示答案对 1 0 9 + 7 10^9+7 109+7 取模的结果。

样例 #1

样例输入 #1

4 2
1 3
2 4

样例输出 #1

2

样例 #2

样例输入 #2

3 0

样例输出 #2

6

样例 #3

样例输入 #3

3 2
1 2
2 1

样例输出 #3

0

提示

对于 20 % 20\% 20% 的测试数据点,保证 1 ≤ n ≤ 8 1\leq n\leq 8 1n8 0 ≤ m ≤ 10 0\leq m\leq 10 0m10

对于另外 20 % 20\% 20% 的测试数据点,保证 1 ≤ n ≤ 1 0 3 1\leq n\leq 10^3 1n103 0 ≤ m ≤ 1 0\leq m\leq 1 0m1

对于所有测试数据点,保证 1 ≤ n ≤ 2 × 1 0 5 1\leq n\leq 2\times 10^5 1n2×105 0 ≤ m ≤ 2 × 1 0 5 0\leq m\leq 2\times 10^5 0m2×105

解题思路

m = 0 m = 0 m=0 时,即求解 n n n 个同学排队的方案数: A n n A_n^n Ann,即 n ! n! n!

m = 1 m = 1 m=1 时,我们可以使用捆绑法,将两个同学打包,变为一个同学,那么方案数为 ( n − 1 ) ! (n - 1)! (n1)!

那么本题转换为,将有特殊需求的同学进行捆绑之后,剩余的同学数量。

那么如何对每一条关系做处理?假设 a a a 要在 b b b 前面,那么我们可以使用两个数组进行标记, r a = b r_a = b ra=b l b = a l_b = a lb=a,表示 a a a 的右边是 b b b b b b 的左边是 a a a。当出现 a a a 在多个人前面,或者是 b b b 在多个人后面,则直接输出 0 0 0

接下来我们考虑如何处理成环的情况,如样例三所示, 1 1 1 要在 2 2 2 前面,且 2 2 2 要在 1 1 1 前面,可以成功通过我们上述处理。考虑用并查集维护每一个特殊处理的区间,当 a a a b b b 为同一个区间时,则直接输出 0 0 0

另外本题特别坑的地方在于,某条建议可能重复出现,如下样例:

2 2
1 2
1 2

那么我们可以进行特判出现过的情况,若 r a = b r_a = b ra=b l b = a l_b = a lb=a,则表示一出现过该关系,即 continue

最后,如何判断一个是一个小团体,还是一个人呢?

可以用并查集,若当前点的祖先为自己,则算做一个人,这样一个团体仅会被算一次。

AC_Code

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 2e5 + 10, MOD = 1e9 + 7;typedef long long LL;int n, m;
int p[N];
int l[N], r[N];int find(int x)
{if (x != p[x])p[x] = find(p[x]);return p[x];
}int main()
{cin >> n >> m;for (int i = 1; i <= n; ++ i )p[i] = i;while (m -- ){int a, b;cin >> a >> b;if (r[a] == b && l[b] == a)continue;if (r[a] || l[b] || find(a) == find(b)){cout << 0 << endl;return 0;}r[a] = b, l[b] = a;a = find(a), b = find(b);p[a] = b;}int res = 1, k = 1;for (int i = 1; i <= n; ++ i )if (find(i) == i)res = (LL)res * k ++ % MOD;cout << res << endl;return 0;
}

》》》点我查看「视频」详解》》》


http://www.ppmy.cn/news/1554784.html

相关文章

【系统架构设计师】真题论文: 论负载均衡技术在 Web 系统中的应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2019年 试题4)解题思路论文素材参考轮询(Round - Robin)算法原理和场景加权轮询(Weighted Round - Robin)算法原理和场景最小连接数(Least - Connections)算法原理和场景负载均衡架构设计负载均衡…

【机器学习】Lesson 6 - 决策树(分类)

目录 背景 一、适用数据集 1. 数据集选择 2. 本文数据集介绍 二、算法原理 1. 算法简介 2. 决策树分类的应用 3. 模型参数设置 4. 决策树相关知识补充 4.1 节点含义 4.2 节点信息解释 4.3 每一层的含义 三、代码 1. 导入包&数据 2. 数据预处理 3. 数据集划分…

过滤器与ajax异步

探索 Java Web 开发中的过滤器与 Ajax 异步请求 在 Java Web 开发的世界里&#xff0c;过滤器&#xff08;Filter&#xff09;和 Ajax 异步请求犹如两把利器&#xff0c;为我们打造高效、安全且用户体验良好的 Web 应用提供了强大的支持。今天&#xff0c;就让我们深入了解这两…

数据分析python小工具录入产品信息到Excel

在没有后台管理系统的时候&#xff0c;有时候为了方便起见&#xff0c;想提供一个输入框让运营人员直接输入&#xff0c;然后数据就会以数据库的形式存进数据库 效果图&#xff1a; 输入用户名 输入数据 输入信息后点击添加到表格&#xff0c;检查后方便批量保存到excel …

(软件测试文档大全)测试计划,测试报告,测试方案,压力测试报告,性能测试,等保测评,安全扫描测试,日常运维检查测试,功能测试等全下载

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…

PHP使用local-proxy的一种思路! | 架构师之路(19)

《架构师之路&#xff1a;架构设计中的100个知识点》 19.脚本语言使用长连接的一种思路 脚本类语言&#xff0c;例如PHP&#xff0c;不能像C/Java那样能搞服务常驻内存&#xff0c;不能搞长连接&#xff1f; 为什么脚本语言要搞长连接&#xff1f; 脚本类语言每次访问后端数据库…

QT-卡片音乐播放器

1&#xff0c;项目界面&#xff1a; 2&#xff0c;体验地址 卡片音乐播放器-V1 – 小平的博客

字体子集化实践探索

最近项目rust生成PDF组件printpdf需要内嵌完整字体导致生成的PDF很大&#xff0c;需要做压缩&#xff0c;但是rust的类库allsorts::subset::subset不支持windows&#xff0c;所以做了一些windows下字体子集化的尝试 方案一&#xff1a;node.js做子集化 fontmin 缺点是也需要集…