Codeforces Round 1021 (Div. 2) D. Baggage Claim(建图)

每周五篇博客:(4/5)

https://codeforces.com/contest/2098/problem/D

题意

每个机场都有一个行李索赔区,巴尔贝索沃机场也不例外。在某个时候,Sheremetyevo的一位管理员提出了一个不寻常的想法:将行李索赔传送带的传统形状从轮播更改为更复杂的形式。

假设行李索赔区域表示为大小 n × m n \times m n×m 的矩形网格。管理局提出,输送机的路径应通过 p 1 , p 2 , … , p 2 k + 1 p_1, p_2, \ldots, p_{2k+1} p1,p2,,p2k+1 的单元,其中 p i = ( x i , y i ) p_i = (x_i, y_i) pi=(xi,yi)

对于每个单元格 p i p_i pi 和下一个单元格 p i + 1 p_{i+1} pi+1 (其中 1 ≤ i ≤ 2 k 1 \leq i \leq 2k 1i2k ),这些单元格必须具有共同的侧面。此外,路径必须很简单,这意味着对于没有一对索引 i ≠ j i \neq j i=j ,如果单元格 p i p_i pi p j p_j pj 的单元格。

不幸的是,路线计划被溢出的咖啡意外宠坏了,只保留了带有奇数指数的细胞: p 1 , p 3 , p 5 , … , p 2 k + 1 p_1, p_3, p_5, \ldots, p_{2k+1} p1,p3,p5,,p2k+1 。您的任务是确定给定这些 k + 1 k+1 k+1 单元格的原始完整路径 p 1 , p 2 , … , p 2 k + 1 p_1, p_2, \ldots, p_{2k+1} p1,p2,,p2k+1 的方法数量。

由于答案可能很大,因此输出它模拟 1 0 9 + 7 10^9+7 109+7

思路

首先对于 p 2 i − 1 , p 2 i + 1 p_{2i - 1},p_{2i + 1} p2i1,p2i+1 ,如果 ∣ p 2 i − 1 − p 2 i + 1 ∣ ≠ 2 |p_{2i - 1}-p_{2i + 1}| \ne 2 p2i1p2i+1=2 的话答案一定是 0 0 0 ,即我们无法通过两步的操作从 p 2 i − 1 p_{2i - 1} p2i1 走到 p 2 i + 1 p_{2i + 1} p2i+1

接下来我们进行建图,如果 p 2 i − 1 p_{2i - 1} p2i1 p 2 i + 1 p_{2i + 1} p2i+1 处于同一行/同一列,那么在他们中间的点连一条自环边;如果 p 2 i − 1 p_{2i - 1} p2i1 p 2 i + 1 p_{2i + 1} p2i+1 不处于同一行/同一列,那么我们在这两个点之间可以通过的两个点进行连边

例如点 ( 1 , 1 ) , ( 1 , 3 ) (1, 1), (1, 3) (1,1),(1,3) ,那么我们会在点 ( 1 , 2 ) (1, 2) (1,2) 处连一条 ( 1 , 2 ) − ( 1 , 2 ) (1, 2) - (1, 2) (1,2)(1,2) 的无向边

例如点 ( 1 , 1 ) , ( 2 , 2 ) (1, 1), (2, 2) (1,1),(2,2) ,那么我们会在点 ( 1 , 2 ) (1, 2) (1,2) ( 2 , 1 ) (2, 1) (2,1) 处连一条 ( 1 , 2 ) − ( 2 , 1 ) (1, 2) - (2,1) (1,2)(2,1) 的无向边

连边本质上是我们让可以作为 p 2 i p_{2i} p2i 的点之间连接起来,意思是只要我们选择边的某个端点都是合法的一种方案作为链接 p 2 i − 1 , p 2 i + 1 p_{2i - 1},p_{2i + 1} p2i1,p2i+1

连边后我们会获得若干个连通块,而这些连通块有以下几种可能:

  1. 如果该连通块的点数比边数要少,那么答案为 0 0 0 。这是因为我们每链接一条边都代表我们需要去选择一个点去链接某对 p 2 i − 1 , p 2 i + 1 p_{2i - 1},p_{2i + 1} p2i1,p2i+1 。如果边比点多的话,那么点数根本就不够选择的,所以答案一定是 0 0 0
  2. 如果该连通块的点数和边数一样,表示该连通块一定存在环,那么同样分成两种情况
    1. 该环是某个节点的自环。此时答案根据乘法原理乘以 1 1 1 。原因见另一种情况的解释
    2. 该环包含了超过一个节点的环。此时答案根据乘法原理乘以 2 2 2 。这个情况可以参考题目的样例 2 2 2 。如果我们选择一个点来固定的话,那么其余点的选择也都固定了。而对于 p 2 i − 1 , p 2 i + 1 p_{2i - 1},p_{2i + 1} p2i1,p2i+1 中的 p 2 i p_{2i} p2i 有两种选择的可能,所以选择的点都有两种方案,那么答案也就是两种了。同理,对于上一种情况,因为有一个 p 2 i p_{2i} p2i 点是唯一选择的,那么答案只能乘以 1 1 1
  3. 如果该连通块的点数比边数要多,那么该连通块一定是棵树,并且答案根据乘法原理乘以点的数量即可。这是因为我们要选边的数量的点来作为一种可行的方案,所以在这棵树中我们可以选择任意一个点作为无用点后可以得到一个固定的可行方案,而这个无用点的选择方案有点的数量个

事实上我们也不需要实际建边再去跑连通分量,只需要用并查集维护每个点都在哪些连通块即可,具体细节见代码

代码

struct DSU {int n;std::vector<int> fa, sz;std::vector<i64> val;explicit DSU(int n): n(n) {fa.assign(n + 1, 0);sz.assign(n + 1, 1);val.assign(n + 1, 0);for (int i = 1; i <= n; i ++) fa[i] = i;}int find(int x) {if (x == fa[x]) return fa[x];int f = fa[x];fa[x] = find(fa[x]);val[x] += val[f];return fa[x];}bool judge(int x, int y) {int dx = find(x), dy = find(y);if (dx == dy) return true;else return false;}void merge(int x, int y, i64 w = 0) {int dx = find(x), dy = find(y);if (dx != dy) {fa[dx] = dy;sz[dy] += sz[dx];val[dx] = -val[x] + val[y] + w;}}
};void solve() {int n, m, k;std::cin >> n >> m >> k;DSU dsu(n * m);std::vector<int> cnt(n * m + 1), loop(n * m + 1);auto get = [&](int x, int y) {return (x - 1) * m + y;};std::vector<PII> a(k + 1);for (int i = 0; i <= k; i ++) std::cin >> a[i].first >> a[i].second;for (int i = 1; i <= k; i ++) {auto [x1, y1] = a[i - 1];auto [x2, y2] = a[i];if (std::abs(x1 - x2) + std::abs(y1 - y2) != 2) {std::cout << "0\n";return ;}int u, v;if (std::abs(x1 - x2) == 1) {u = get(x1, y2), v = get(x2, y1);} else if (x1 == x2) {u = get(x1, (y1 + y2) / 2), v = get(x1, (y1 + y2) / 2);} else if (y1 == y2) {u = get((x1 + x2) / 2, y1), v = get((x1 + x2) / 2, y1);}if (!dsu.judge(u, v)) {cnt[dsu.find(u)] += cnt[dsu.find(v)];loop[dsu.find(u)] |= loop[dsu.find(v)];dsu.merge(v, u);}cnt[dsu.find(u)] ++;if (u == v) loop[dsu.find(u)] = 1;}Z ans = 1;for (int i = 0; i <= n * m; i ++) if (dsu.find(i) == i) {int sz = dsu.sz[i];if (sz < cnt[i]) {ans = 0;break;} else if (sz == cnt[i]) {if (loop[i]) {ans *= 1;} else {ans *= 2;}} else {ans *= sz;}}std::cout << ans << '\n';
}

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

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

相关文章

LLM(大语言模型)技术的最新进展可总结

截至2025年4月26日&#xff0c;LLM&#xff08;大语言模型&#xff09;技术的最新进展可总结为以下关键方向&#xff1a; 1. 架构创新与性能突破 多模态能力深化&#xff1a;GPT-4o等模型通过统一架构支持文本、图像、音频和视频的跨模态推理&#xff0c;显著提升复杂场景下的…

黑马点评redis改 part 6

GEO数据结构 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&#xff0c;包含&a…

Spring_MVC 中的 JSON 数据处理与 REST 风格开发

Spring_MVC 中的 JSON 数据处理与 REST 风格开发 一、JSON 格式参数 1. 格式布置 依赖导入 为了处理 JSON 数据&#xff0c;需要在项目中引入 Jackson 库&#xff0c;它是 Spring_MVC 默认使用的 JSON 处理工具。 <dependency><groupId>com.fasterxml.jackson…

蓝桥杯 8. 移动距离

移动距离 原题目链接 题目描述 X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。楼房的编号为 1, 2, 3, ⋯⋯。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 例如&#xff0c;当小区排号宽度为 6 时&#xff0c;排列如下&#xff1a; 1 2 …

第11章 安全网络架构和组件(一)

11.1 OSI 模型 协议可通过网络在计算机之间进行通信。 协议是一组规则和限制&#xff0c;用于定义数据如何通过网络介质&#xff08;如双绞线、无线传输等&#xff09;进行传输。 国际标准化组织(ISO)在20世纪70年代晚期开发了开放系统互连(OSI)参考模型。 11.1.1 OSI模型的…

文献分享:一种四价双特异性抗体的功能性和IgG样稳定性、药理学和可开发特性研究

背景 双特异性抗体&#xff08;bsAb&#xff09;是一种有前途的药物形式&#xff0c;能够同时结合相同或不同抗原上的两个不同表位。迄今为止&#xff0c;已有14个双特异性抗体药物获得上市批准&#xff0c;尽管取得了这些成功并且迄今为止设计了多种形式&#xff0c;但具有高…

英文中数字读法规则

以下是英文中数字读法的详细规则&#xff0c;涵盖基本数字、大数字、小数、分数、序数词及特殊场景&#xff08;如电话号码、年份、金额等&#xff09;&#xff1a; 一、基本数字&#xff08;0-10&#xff09; 数字基数词&#xff08;Cardinal&#xff09;序数词&#xff08;O…

32BIT的SPI主机控制

SPI传输位数可参数化配置。 SPI_MASTER: timescale 1ns / 1ps module SPI_Master #(parameter CLK_FREQ 50,parameter SPI_CLK 1000,parameter CPOL 0,parameter CPHA 0 )(input clk,input rst_n,input WrRdReq, //读/写数据请求output …

vue响应式原理——vue2和vue3的响应式实现区别

Vue的核心功能点之一是响应式&#xff1a;Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM。 简单的来说就是&#xff0c;页面的渲染效果会随着数据变化而变化&#xff0c;不用我们去手动操作DOM树进行数据变化后的渲染。为了实现这一目的&#xff0c;我们最简…

Kaamel白皮书:2025版COPPA落地实操指南

COPPA简介 《儿童在线隐私保护法案》&#xff08;COPPA&#xff09;于1998年在美国颁布&#xff0c;其最初的动因源于人们日益增长的对互联网上收集儿童个人信息的担忧。为了响应这一问题&#xff0c;联邦贸易委员会&#xff08;FTC&#xff09;被授权制定并执行相关法规。COP…

测试基础笔记第十四天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、字符串1.字符串2.字符串切片3.查找find&#xff08;&#xff09;4.去除两端空白字符 strip5.字符串转换大小写 lower、upper5.拆分 split()6.字符串的其他常见方…

什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?

大家好&#xff0c;我是锋哥。今天分享关于【什么是Lua模块&#xff1f;你会如何使用NGINX的Lua模块来定制请求处理流程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是Lua模块&#xff1f;你会如何使用NGINX的Lua模块来定制请求处理流程&#xff1f; 1000道 互联…

ubuntu扩展逻辑卷并调整文件系统大小步骤

安装好ubuntu如果没有调整磁盘空间,一般默认给你100G的空间,在用完时再调整也还来得及,下面是 ubuntu扩展逻辑卷并调整文件系统大小步骤&#xff1a; 1. 扩展逻辑卷 运行以下命令来扩展逻辑卷 /dev/ubuntu-vg/ubuntu-lv&#xff0c;使其使用卷组中所有未分配的空间&#xff…

复杂背景下无人机影像小目标检测:MPE-YOLO抗遮挡与抗背景干扰设计

目录 一、引言 二、挑战和贡献 密集小目标和遮挡 实时性要求与精度权衡 复杂背景 三、MPE-YOLO模型细节 多级特征集成器&#xff08;MFI&#xff09; 感知增强卷积&#xff08;PEC&#xff09; 增强范围C2f模块&#xff08;ES-C2f&#xff09; 四、Coovally AI模型训…

【C++】13.list的模拟实现

首先&#xff0c;我们需要把链表管理起来&#xff0c;也就是把一个个节点管理起来&#xff0c;但是每个节点的信息我们也需要管理&#xff0c;例如节点的前驱指针和后驱指针&#xff0c;以及节点的值&#xff0c;所以我们这里先封装两个类来管理节点和链表。 namespace Ro {te…

TinyVue v3.22.0 正式发布:深色模式上线!集成 UnoCSS 图标库!TypeScript 类型支持全面升级!

我们非常高兴地宣布&#xff0c;2025年4月7日&#xff0c;TinyVue发布了v3.22.0&#x1f389;。 本次 3.22.0 版本主要有以下重大变更&#xff1a; 支持深色模式增加基于 UnoCSS 的图标库更丰富的 TypeScript 类型声明支持 XSS 配置 详细的 Release Notes 请参考&#xff1a…

超级创新思路:基于CBAM-Transformer的强化学习时间序列预测模型(Python\matlab实现)

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴!需要完整代码可私信或评论! 本方案可用于医疗、金融、交通、零售、光伏功率预测、估计预测、天气预测、流量预测、故障检测等领域! 目录 首先声明,该模型为原创!原创!原创!且该思…

Apache Sqoop数据采集问题

Sqoop数据采集格式问题 一、Sqoop工作原理二、Sqoop命令格式三、Oracle数据采集格式问题四、Sqoop增量采集方案 Apache Sqoop是一款开源的工具&#xff0c;主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递&#xff0c;可以将一个关系型数据库&…

Grok发布了Grok Studio 和 Workspaces两个强大的功能。该如何使用?如何使用Grok3 API?

最近Grok又更新了几个功能&#xff1a;Grok Studio 和 Workspaces。 其中 Grok Studio 主要功能包括&#xff1a; 代码执行&#xff1a;在预览标签中运行 HTML 片段、Python、JavaScript 等。 Google Drive 集成&#xff1a;附加并处理 Docs、Sheets、Slides等文件。 协作工…

Vue选项式 API 与组合式 API

选项式 API 与组合式 API 选项式 API 选项式 API 是 Vue 2 中常用的开发方式&#xff0c;在 Vue 3 里依旧得到支持。它把组件逻辑划分为不同的选项&#xff0c;像 data、methods、computed 等。 <template><div><p>Count: {{ count }}</p><button…