当前位置: 首页 > news >正文

【蓝桥杯集训·每日一题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
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢

相关文章:

【蓝桥杯集训·每日一题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 头奶牛的…...

AI发展迅速,是否还有学习前端的必要性?

今天有个小伙伴跟我讨论:“现在 AI 发展迅速,是否还有学习 JS 或者 TS 及前端知识的必要?” 我非常肯定地说: 是的,学习 JavaScript/TypeScript 以及前端知识仍然非常必要,而且在可预见的未来,…...

【数据标准】数据标准化是数据治理的基础

导读:数据标准化是数据治理的基石,它通过统一数据格式、编码、命名与语义等,全方位提升数据质量,确保准确性、完整性与一致性,从源头上杜绝错误与冲突。这不仅打破部门及系统间的数据壁垒,极大促进数据共享…...

VS2022配置FFMPEG库基础教程

1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年,由法国工程师Fabrice Bellard主导开发,其名称源自"Fast Forward MPEG",初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护,逐步发展成为包含音视频采…...

three.js之特殊材质效果

*案例42 创建一个透明的立方体 <template><div ref"container" className"container"></div> </template><script setup> import * as THREE from three; import WebGL from three/examples/jsm/capabilities/WebGL.js // 引…...

Qt常用控件之日历QCalendarWidget

日历QCalendarWidget QCalendarWidget 是一个日历控件。 QCalendarWidget属性 属性说明selectDate当前选中日期。minimumDate最小日期。maximumDate最大日期。firstDayOfWeek设置每周的第一天是周几&#xff08;影响日历的第一列是周几&#xff09;。gridVisible是否显示日历…...

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体&#xff0c;当输入的值为负数时&#xff0c;会自动显示红色字体&#xff0c;对于数值或者金额输入时该功能就非常有用了。 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.co…...

DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖

最近是接了一个需求咨询图像处理类的&#xff0c;甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全&#xff0c; 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件&#xff0c;能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…...

算法日记27:完全背包(DFS->记忆化搜索->倒叙DP->顺序DP->空间优化)

一、暴力搜索&#xff08;DFS&#xff09; O ( n 2 ) O(n^2) O(n2) 1.1&#xff09;思路解析 1、注意和01背包的区别在于每个物品可以无限次选择 注意在完全背包中&#xff0c;当一个物品被选择过一次&#xff0c;我们仍然需要考虑是否继续选择这个物品 01背包&#xff1a; …...

Linux 命令大全完整版(14)

5. 文件管理命令 chgrp(change group) 功能说明&#xff1a;变更文件或目录的所属群组。语  法&#xff1a;chgrp [-cfhRv][–help][–version][所属群组][文件或目录…] 或 chgrp [-cfhRv][–help][–version][–reference<参考文件或目录>][文件或目录…]补充说明&…...

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…...

Could not initialize class io.netty.util.internal.Platfor...

异常信息&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…...

【书生大模型实战营】玩转HF/魔搭/魔乐社区-L0G4000

本文是书生大模型实战营系列的第4篇&#xff0c;本文的主题是&#xff1a;玩转HF/魔搭/魔乐社区。 1.开源大模型社区总览 开源不仅仅是一种技术模式&#xff0c;更是一种精神的体现。它打破了知识的壁垒&#xff0c;让技术平权成为可能。近年来&#xff0c;开源大模型社区蓬勃…...

2025年华为手机解锁BL的方法

注&#xff1a;本文是我用老机型测试的&#xff0c;新机型可能不适用 背景 华为官方已经在2018年关闭了申请BL解锁码的通道&#xff0c;所以华为手机已经无法通过官方获取解锁码。最近翻出了一部家里的老手机华为畅玩5X&#xff0c;想着能不能刷个系统玩玩&#xff0c;但是卡…...

了解 RAG 第二部分:经典 RAG 的工作原理

在本系列的第一篇文章中&#xff0c;我们介绍了检索增强生成 (RAG) &#xff0c;解释了扩展传统大型语言模型 (LLM)功能的必要性。我们还简要概述了 RAG 的核心思想&#xff1a;从外部知识库检索上下文相关的信息&#xff0c;以确保 LLM 生成准确且最新的信息&#xff0c;而不会…...

50周学习go语言:第四周 函数与错误处理深度解析

第四周 函数与错误处理深度解析 以下是第4周函数基础的深度教程&#xff0c;包含两个完整案例和详细实现细节&#xff1a; 第四周&#xff1a;函数与错误处理深度解析 一、函数定义与参数传递 1. 基础函数结构 // 基本语法 func 函数名(参数列表) 返回值类型 {// 函数体 }// …...

debian 12安装 postgresql 17

按照官方文档安装&#xff0c;即可安装成功 https://www.postgresql.org/download/linux/debian/ 添加存储库 #添加存储库 sudo apt install -y postgresql-common#执行 存储库内 命令&#xff0c;自动处理某些东西 sudo /usr/share/postgresql-common/pgdg/apt.postgresql.o…...

C++....................4

1. using namespace std; class mystring { private:char* p;int len;// 辅助函数&#xff1a;复制字符串void copy(const char* source) {len strlen(source);p new char[len 1];strcpy(p, source);}// 辅助函数&#xff1a;释放内存void release() {if (…...

图书馆系统源码详解

本项目是一个基于Scala语言开发的图书馆管理系统。系统主要由以下几个部分组成&#xff1a;数据访问层&#xff08;DAO&#xff09;、数据模型层&#xff08;Models&#xff09;、服务层&#xff08;Service&#xff09;以及用户界面层&#xff08;UI&#xff09;。以下是对项目…...

Node.js中如何修改全局变量的几种方式

Node.js中如何修改全局变量。我需要先理解他们的需求。可能他们是在开发过程中遇到了需要跨模块共享数据的情况&#xff0c;或者想要配置一些全局可访问的设置。不过&#xff0c;使用全局变量可能存在一些问题&#xff0c;比如命名冲突、难以维护和测试困难&#xff0c;所以我得…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...