【藍橋杯集訓·每日一題2025】 AcWing 6135. 奶牛體檢 python



6135. 奶牛體檢

Week 1
2月21日


農夫約翰的 N N N 頭奶牛站成一行,奶牛 1 1 1 在隊伍的最前面,奶牛 N N N 在隊伍的最后面。

農夫約翰的奶牛也有許多不同的品種。

他用從 1 1 1 N N N 的整數來表示每一品種。

隊伍從前到后第 i i i 頭奶牛的品種是 a i a_i ai?

農夫約翰正在帶他的奶牛們去當地的奶牛醫院進行體檢。

然而,奶牛獸醫非常挑剔,僅愿意當隊伍中第 i i i 頭奶牛為品種 b i b_i bi? 時對其進行體檢。

農夫約翰很懶惰,不想完全重新排列他的奶牛。

他將執行以下操作恰好一次

  • 選擇兩個整數 l l l r r r,使得 1 ≤ l ≤ r ≤ N 1≤l≤r≤N 1lrN。反轉隊伍中第 l l l 頭奶牛到第 r r r 頭奶牛之間的奶牛的順序。

農夫約翰想要衡量這種方法有多少效果。

對于每一個 c = 0 … N c=0…N c=0N,請幫助農夫約翰求出使得恰好 c c c 頭奶牛被檢查的不同操作 ( l , r ) (l,r) (l,r) 的數量。

兩種操作 ( l 1 , r 1 ) (l_1,r_1) (l1?,r1?) ( l 2 , r 2 ) (l_2,r_2) (l2?,r2?) 不同,如果 l 1 ≠ l 2 l_1 \neq l_2 l1?=l2? 或者 r 1 ≠ r 2 r_1 \neq r_2 r1?=r2?

輸入格式

輸入的第一行包含 N N N

第二行包含 a 1 , a 2 , … , a N a_1,a_2,…,a_N a1?,a2?,,aN?

第三行包含 b 1 , b 2 , … , b N b_1,b_2,…,b_N b1?,b2?,,bN?

輸出格式

輸出 N + 1 N+1 N+1 行,第 i i i 行包含使得 i ? 1 i?1 i?1 頭奶牛被檢查的不同操作 ( l , r ) (l,r) (l,r) 的數量。

數據范圍

1 ≤ N ≤ 7500 1 \le N \le 7500 1N7500,
1 ≤ a i , b i ≤ N 1 \le a_i,b_i \le N 1ai?,bi?N

輸入樣例1:
3
1 3 2
3 2 1
輸出樣例1:
3
3
0
0
樣例1解釋

如果農夫約翰選擇 ( l = 1 , r = 1 ) (l=1,r=1) (l=1,r=1) ( l = 2 , r = 2 ) (l=2,r=2) (l=2,r=2) ( l = 3 , r = 3 ) (l=3,r=3) (l=3,r=3),則沒有奶牛將會被檢查。

注意這些操作并沒有改變奶牛的位置。

以下操作會導致一頭奶牛被檢查。

  • ( l = 1 , r = 2 ) (l=1,r=2) (l=1,r=2):農夫約翰反轉第一頭和第二頭奶牛的順序,因此新隊伍中每頭奶牛的品種將為 [ 3 , 1 , 2 ] [3,1,2] [3,1,2]。第一頭奶牛將會被檢查。
  • ( l = 2 , r = 3 ) (l=2,r=3) (l=2,r=3):農夫約翰反轉第二頭和第三頭奶牛的順序,因此新隊伍中每頭奶牛的品種將為 [ 1 , 2 , 3 ] [1,2,3] [1,2,3]。第二頭奶牛將會被檢查。
  • ( l = 1 , r = 3 ) (l=1,r=3) (l=1,r=3):農夫約翰反轉第一頭,第二頭和第三頭奶牛的順序,因此新隊伍中每頭奶牛的品種將為 [ 2 , 3 , 1 ] [2,3,1] [2,3,1]。第三頭奶牛將會被檢查。
輸入樣例2:
3
1 2 3
1 2 3
輸出樣例2:
0
3
0
3
樣例2解釋

三種導致 3 3 3 頭奶牛被檢查的可能操作為 ( l = 1 , r = 1 ) (l=1,r=1) (l=1,r=1) ( l = 2 , r = 2 ) (l=2,r=2) (l=2,r=2) ( l = 3 , r = 3 ) (l=3,r=3) (l=3,r=3)

輸入樣例3:
7
1 3 2 2 1 3 2
3 2 2 1 2 3 1
輸出樣例3:
0
6
14
6
2
0
0
0
樣例3解釋

兩種導致 4 4 4 頭奶牛被檢查的可能操作為 ( l = 4 , r = 5 ) (l=4,r=5) (l=4,r=5) ( l = 5 , r = 7 ) (l=5,r=7) (l=5,r=7)



方法1:
枚舉區間中點,向兩邊擴展

實現code

n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
ans = [0] * (n + 1)cnt = 0
for i in range(n):if a[i] == b[i]:cnt += 1for i in range(n):for j in range(2):sum = cntfor l in range(i, -1, -1):r = i + j + abs(l - i)if r >= n:breakif a[l] == b[r]:sum += 1if a[r] == b[l]:sum += 1if a[l] == b[l]:sum -= 1if a[r] == b[r]:sum -= 1ans[sum] += 1
print('\n'.join(map(str, ans)))

代碼解釋

1. 初始匹配數計算
cnt = 0
for i in range(n):if a[i] == b[i]:cnt += 1
  • 這里計算初始狀態下有多少奶牛的位置和品種匹配,即 a[i] == b[i]
  • cnt 表示初始匹配數。

2. 枚舉區間中點并向兩邊擴展
for i in range(n):for j in range(2): # 奇數長度區間和偶數長度區間sum = cntfor l in range(i, -1, -1):r = i + j + abs(l - i)if r >= n:break# 更新匹配數if a[l] == b[r]:sum += 1if a[r] == b[l]:sum += 1if a[l] == b[l]:sum -= 1if a[r] == b[r]:sum -= 1ans[sum] += 1
  • 外層循環 for i in range(n)

    • 枚舉區間的中點 i
    • 中點可以是某個位置(奇數長度區間)或兩個位置之間(偶數長度區間)。
  • 內層循環 for j in range(2)

    • j 用于區分奇數長度區間和偶數長度區間。
    • j = 0 時,區間長度為奇數,中點為 i
    • j = 1 時,區間長度為偶數,中點為 ii+1
  • 內層循環 for l in range(i, -1, -1)

    • 從中點 i 向左擴展,枚舉左端點 l
    • 根據 j 的值計算右端點 r
      • r = i + j + abs(l - i)
      • 如果 r >= n,說明右端點超出范圍,直接跳出循環。
  • 更新匹配數

    • 反轉區間 [l, r] 后,更新匹配數 sum
      • 如果 a[l] == b[r],反轉后匹配數增加 1。
      • 如果 a[r] == b[l],反轉后匹配數增加 1。
      • 如果 a[l] == b[l],反轉前匹配,反轉后不匹配,匹配數減少 1。
      • 如果 a[r] == b[r],反轉前匹配,反轉后不匹配,匹配數減少 1。
  • 更新答案

    • 根據當前的匹配數 sum,更新答案數組 ans[sum] += 1


正確性分析


  1. 初始匹配數計算

    • 正確計算了初始狀態下匹配的奶牛數量。
  2. 枚舉區間中點并向兩邊擴展

    • 通過枚舉中點 i 和區分奇數/偶數長度區間,確保所有可能的區間 [l, r] 都被覆蓋。
    • 反轉區間 [l, r] 后,匹配數的更新邏輯正確:
      • 反轉后,a[l]b[r] 匹配,a[r]b[l] 匹配。
      • 反轉前,a[l]b[l] 匹配,a[r]b[r] 匹配,反轉后這些匹配會消失。
  3. 時間復雜度

    • 外層循環 for i in range(n)for j in range(2) 總共迭代 2n 次。
    • 內層循環 for l in range(i, -1, -1) 最多迭代 n 次。
    • 因此,總時間復雜度為 O(N2)


示例分析

輸入樣例 1:
3
1 3 2
3 2 1
  • 初始匹配數 cnt = 0
  • 枚舉所有區間 [l, r]
    • (l=1, r=1):反轉后匹配數為 0。
    • (l=2, r=2):反轉后匹配數為 0。
    • (l=3, r=3):反轉后匹配數為 0。
    • (l=1, r=2):反轉后匹配數為 1。
    • (l=2, r=3):反轉后匹配數為 1。
    • (l=1, r=3):反轉后匹配數為 1。
  • 輸出:
    3
    3
    0
    0
    

方法2:
遞推:區間DP


思路

  1. 問題分析

    • 農夫約翰的奶牛隊伍有 N 頭奶牛,每頭奶牛有一個品種。
    • 獸醫只愿意檢查隊伍中第 i 頭奶牛為品種 b[i] 的情況。
    • 農夫約翰可以選擇一個區間 [l, r] 反轉奶牛的順序,恰好執行一次。
    • 需要計算對于每個 c = 0...N,有多少種操作 (l, r) 使得恰好 c 頭奶牛被檢查。
  2. 關鍵觀察

    • 反轉區間 [l, r] 后,區間內的奶牛順序會反轉,而區間外的奶牛順序不變。
    • 反轉后,區間內的匹配數會發生變化,而區間外的匹配數不變。
  3. 動態規劃設計

    • 定義 dp[l][r] 表示反轉區間 [l, r] 后的匹配數。
    • 初始化:
      • 單個區間 [i, i] 的反轉匹配數為 cnt(初始匹配數)。
      • 區間長度為 2 的情況需要單獨處理。
    • 轉移:
      • 對于區間 [l, r],反轉后的匹配數等于 dp[l + 1][r - 1] + cost,其中 cost 是反轉區間 [l, r] 帶來的匹配數變化。
  4. 統計結果

    • 遍歷所有區間 [l, r],統計每種匹配數對應的操作數量。

代碼解釋

1. 初始匹配數計算
cnt = 0
for i in range(n):if a[i] == b[i]:cnt += 1
  • 計算初始狀態下有多少奶牛的位置和品種匹配,即 a[i] == b[i]
  • cnt 表示初始匹配數。

2. DP 數組初始化
for i in range(n):dp[i][i] = cnt
  • 初始化單個區間 [i, i] 的反轉匹配數。
  • 對于單個區間,反轉后匹配數不變,因此 dp[i][i] = cnt

3. 初始化區間長度為 2
for i in range(n-1):l, r = i, i+1cost = 0if a[l] == b[r]:cost += 1if a[r] == b[l]:cost += 1if a[l] == b[l]:cost -= 1if a[r] == b[r]:cost -= 1dp[l][r] = cnt + cost
  • 單獨處理區間長度為 2 的情況,避免越界。
  • 計算反轉后的匹配數,并更新 dp[l][r]

4. DP 轉移
for len in range(3, n + 1):for l in range(n - len + 1):r = l + len - 1cost = 0if a[l] == b[r]:cost += 1if a[r] == b[l]:cost += 1if a[l] == b[l]:cost -= 1if a[r] == b[r]:cost -= 1dp[l][r] = dp[l + 1][r - 1] + cost
  • 枚舉區間長度 len,從 3 到 n
  • 對于每個區間 [l, r],計算反轉后的匹配數:
    • 如果 a[l] == b[r],反轉后匹配數增加 1。
    • 如果 a[r] == b[l],反轉后匹配數增加 1。
    • 如果 a[l] == b[l],反轉前匹配,反轉后不匹配,匹配數減少 1。
    • 如果 a[r] == b[r],反轉前匹配,反轉后不匹配,匹配數減少 1。
  • 更新 dp[l][r] 的值。

5. 統計結果
for l in range(n):for r in range(l, n):ans[dp[l][r]] += 1
  • 遍歷所有區間 [l, r],統計每種匹配數對應的操作數量。

6. 輸出結果
print('\n'.join(map(str, ans)))
  • 輸出每種匹配數對應的操作數量。


END
如果有更多問題或需要進一步的幫助,可以在評論區留言討論哦!
如果喜歡的話,請給博主點個關注 謝謝

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71787.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法系列之搜素算法-二分查找

在算法中,查找算法是處理數據集合的基礎操作之一。二分查找(Binary Search)是一種高效的查找算法,適用于有序數組或列表。本文將介紹二分查找的基本原理、Java實現。 二分查找介紹 二分查找是一種在有序數組中查找特定元素的算法…

JVM生產環境問題定位與解決實戰(三):揭秘Java飛行記錄器(JFR)的強大功能

提到飛行記錄器,或許你的腦海中并未立刻浮現出清晰的畫面,但一說起“黑匣子”,想必大多數人都能恍然大悟,知曉其重要性及用途。在航空領域,黑匣子作為不可或缺的設備,默默記錄著飛行過程中的每一項關鍵數據…

C#開發——ConcurrentDictionary集合

ConcurrentDictionary<TKey, TValue> 是 C# 中一個專為多線程場景設計的線程安全字典集合&#xff0c;位于 System.Collections.Concurrent 命名空間中。它允許多個線程同時對字典進行讀寫操作&#xff0c;而無需額外的同步措施。 一、集合特征 此集合有如下特征…

Unity百游修煉(2)——Brick_Breaker詳細制作全流程

一、項目簡介 Brick Breaker 是一款經典的打磚塊游戲&#xff0c;本次案例將使用 Unity 引擎來實現該游戲的核心功能。 游戲畫面如下&#xff1a; Brick_ breaker 二、項目結構概覽和前期準備 &#xff08;1&#xff09;在 Unity 項目視圖中&#xff0c;我們可以看到幾個重要…

KubeSphere平臺安裝

KubeSphere簡介 KubeSphere 是一款功能強大的容器管理平臺&#xff0c;以下是其簡介&#xff1a; 1&#xff09;基本信息 開源項目&#xff1a;基于 Apache-2.0 授權協議開源&#xff0c;由 Google Go、Groovy、HTML/CSS 和 Shell 等多種編程語言開發。基礎架構&#xff1a;…

UE5銷毀Actor,移動Actor,簡單的空氣墻的制作

1.銷毀Actor 1.Actor中存在Destory()函數和Destoryed()函數 Destory()函數是成員函數&#xff0c;它會立即標記 Actor 為銷毀狀態&#xff0c;并且會從場景中移除該 Actor。它會觸發生命周期中的銷毀過程&#xff0c;調用 Destroy() 后&#xff0c;Actor 立即進入銷毀過程。具體…

Hadoop 基礎原理

Hadoop 基礎原理 基本介紹Hadoop 的必要性Hadoop 核心組件Hadoop 生態系統中的附加組件 HDFSHDFS 集群架構HDFS 讀寫流程HDFS 寫流程HDFS 讀流程 NameNode 持久化機制 MapReduce底層原理示例 Hadoop 是一個由 Apache 基金會開發的分布式系統基礎架構&#xff0c;主要解決海量數…

Linux編輯器

1.三種模式 2.圖例 3.wq 4.光標的使用

2.24DFS和BFS刷題

洛谷P2895&#xff1a;用BFS走出危險區域&#xff0c;危險區域存在時間&#xff0c;我們用ma記錄最快變成危險區域的時間&#xff0c; 然后每次枚舉時間1然后跟ma數組比較看能不能走&#xff0c;然后時間復雜度為O(305^2)。 #include<iostream> #include<cstring>…

TMDS視頻編解碼算法

因為使用的是DDR進行傳輸&#xff0c;即雙倍頻率采樣&#xff0c;故時鐘只用是并行數據數據的5倍&#xff0c;而不是10倍。 TMDS算法流程&#xff1a; 視頻編碼TMDS算法流程實現&#xff1a; timescale 1 ps / 1ps //DVI編碼通常用于視頻傳輸&#xff0c;將并行數據轉換為適合…

C++中tuple的用法

C中tuple的用法 在C中&#xff0c;std::tuple 是一個模板類&#xff0c;用于存儲一組不同類型的值。它類似于 Python 中的元組&#xff0c;但具有更強大的功能&#xff0c;例如支持不同類型的元素和更復雜的操作。std::tuple 是 C11 標準引入的&#xff0c;位于 <tuple>…

計算機網絡————(一)HTTP講解

基礎內容分類 從TCP/IP協議棧為依托&#xff0c;由上至下、從應用層到基礎設施介紹協議。 1.應用層&#xff1a; HTTP/1.1 Websocket HTTP/2.0 2.應用層的安全基礎設施 LTS/SSL 3.傳輸層 TCP 4.網絡層及數據鏈路層 IP層和以太網 HTTP協議 網絡頁面形成基本 流程&#xff1a…

【網絡編程】廣播和組播

數據包發送方式只有一個接受方&#xff0c;稱為單播。如果同時發給局域網中的所有主機&#xff0c;稱為廣播。只有用戶數據報(使用UDP協議)套接字才能廣播&#xff1a; 廣播地址以192.168.1.0 (255.255.255.0) 網段為例&#xff0c;最大的主機地址192.168.1.255代表該網段的廣…

小程序如何實現跨頁面通信

前言 最近有很多同學問&#xff0c;小程序里面如何進行跨頁面通信。看了下之前的老代碼&#xff0c;基本都是基于onShow或者localStorage。雖然可以實現&#xff0c;但是并不怎么優雅。 今天就來聊一聊&#xff0c;小程序的跨頁面通信的幾種實現方案。或許會有你想要的方案&a…

【工具】win-畫圖 保留圖片信息并僅改變圖片比例的工具

Windows 系統自帶的“畫圖”工具 Windows 系統自帶的“畫圖”&#xff08;Paint&#xff09;工具可以進行簡單的圖片編輯&#xff0c;包括調整圖片大小和比例。 使用方法&#xff1a; 打開“畫圖”工具&#xff08;可以通過在開始菜單中搜索“畫圖”或“Paint”&#xff09;。…

如何編輯autodl中以.bashrc結尾的隱藏文件

在nnunet的運行過程中遇到了設置環境變量的問題。之前沒有接觸過linux系統&#xff0c;但是autodl里面默認是linux系統。.bashrc 是一個在 Bash shell 啟動時執行的腳本文件&#xff0c;常用于設置環境變量、定義別名、加載函數等&#xff0c;用戶可以通過編輯這個文件來定制自…

實驗3 知識表示與推理

實驗3 知識表示與推理 一、實驗目的 &#xff08;1&#xff09;掌握知識和知識表示的基本概念&#xff0c;理解其在AI中的深刻含義與意義&#xff1b; &#xff08;2&#xff09;熟悉AI中常用的知識表示方法的優缺點及其應用場景&#xff1b; &#xff08;3&#xff09;掌握產…

在 M1 Mac 上解鎖 TensorFlow GPU 加速:從環境搭建到實戰驗證

在 M1 Mac 上解鎖 TensorFlow GPU 加速&#xff1a;從環境搭建到實戰驗證 前言&#xff1a;蘋果芯片的深度學習新紀元 隨著 Apple Silicon 芯片的普及&#xff0c;M1/M2/M3 系列 Mac 已成為移動端深度學習開發的新選擇。本文將以 TensorFlow 2.x 為例&#xff0c;手把手教你如…

Python 數據分析概述 ①

一文讀懂Python數據分析&#xff1a;從基礎到實踐全攻略 在當今數字化浪潮中&#xff0c;數據分析已然成為解鎖海量數據價值的關鍵鑰匙&#xff0c;而Python憑借其獨特優勢&#xff0c;在數據分析領域大放異彩。今天&#xff0c;咱們就結合教學PPT內容&#xff0c;深入探索Pyt…

【Gin-Web】Bluebell社區項目梳理6:限流策略-漏桶與令牌桶

本文目錄 一、限流二、漏桶三、令牌桶算法四、Gin框架中實現令牌桶限流 一、限流 限流又稱為流量控制&#xff0c;也就是流控&#xff0c;通常是指限制到達系統的并發請求數。 限流雖然會影響部分用戶的使用體驗&#xff0c;但是能一定程度上保證系統的穩定性&#xff0c;不至…