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} p2i?1?,p2i+1? ,如果 ∣ p 2 i ? 1 ? p 2 i + 1 ∣ ≠ 2 |p_{2i - 1}-p_{2i + 1}| \ne 2 p2i?1??p2i+1?=2 的話答案一定是 0 0 0 ,即我們無法通過兩步的操作從 p 2 i ? 1 p_{2i - 1} p2i?1? 走到 p 2 i + 1 p_{2i + 1} p2i+1?

接下來我們進行建圖,如果 p 2 i ? 1 p_{2i - 1} p2i?1? p 2 i + 1 p_{2i + 1} p2i+1? 處于同一行/同一列,那么在他們中間的點連一條自環邊;如果 p 2 i ? 1 p_{2i - 1} p2i?1? 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} p2i?1?,p2i+1?

連邊后我們會獲得若干個連通塊,而這些連通塊有以下幾種可能:

  1. 如果該連通塊的點數比邊數要少,那么答案為 0 0 0 。這是因為我們每鏈接一條邊都代表我們需要去選擇一個點去鏈接某對 p 2 i ? 1 , p 2 i + 1 p_{2i - 1},p_{2i + 1} p2i?1?,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} p2i?1?,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.pswp.cn/pingmian/78474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78474.shtml
英文地址,請注明出處:http://en.pswp.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…