【蓝桥杯集训·每日一题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 i1 头奶牛被检查的不同操作 ( 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,biN

输入样例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(N²)


示例分析

输入样例 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.mzph.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;不至…