【蓝桥杯集训·每日一题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 1≤l≤r≤N。反转队伍中第 l l l 头奶牛到第 r r r 头奶牛之间的奶牛的顺序。
农夫约翰想要衡量这种方法有多少效果。
对于每一个 c = 0 … N c=0…N c=0…N,请帮助农夫约翰求出使得恰好 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 1≤N≤7500,
1 ≤ a i , b i ≤ N 1 \le a_i,b_i \le N 1≤ai,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时,区间长度为偶数,中点为i和i+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。
- 根据当前的匹配数
正确性分析
-
初始匹配数计算:
- 正确计算了初始状态下匹配的奶牛数量。
-
枚举区间中点并向两边扩展:
- 通过枚举中点
i和区分奇数/偶数长度区间,确保所有可能的区间[l, r]都被覆盖。 - 反转区间
[l, r]后,匹配数的更新逻辑正确:- 反转后,
a[l]和b[r]匹配,a[r]和b[l]匹配。 - 反转前,
a[l]和b[l]匹配,a[r]和b[r]匹配,反转后这些匹配会消失。
- 反转后,
- 通过枚举中点
-
时间复杂度:
- 外层循环
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
思路
-
问题分析:
- 农夫约翰的奶牛队伍有
N头奶牛,每头奶牛有一个品种。 - 兽医只愿意检查队伍中第
i头奶牛为品种b[i]的情况。 - 农夫约翰可以选择一个区间
[l, r]反转奶牛的顺序,恰好执行一次。 - 需要计算对于每个
c = 0...N,有多少种操作(l, r)使得恰好c头奶牛被检查。
- 农夫约翰的奶牛队伍有
-
关键观察:
- 反转区间
[l, r]后,区间内的奶牛顺序会反转,而区间外的奶牛顺序不变。 - 反转后,区间内的匹配数会发生变化,而区间外的匹配数不变。
- 反转区间
-
动态规划设计:
- 定义
dp[l][r]表示反转区间[l, r]后的匹配数。 - 初始化:
- 单个区间
[i, i]的反转匹配数为cnt(初始匹配数)。 - 区间长度为 2 的情况需要单独处理。
- 单个区间
- 转移:
- 对于区间
[l, r],反转后的匹配数等于dp[l + 1][r - 1] + cost,其中cost是反转区间[l, r]带来的匹配数变化。
- 对于区间
- 定义
-
统计结果:
- 遍历所有区间
[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 头奶牛的…...
【为什么用pg数据库用 != null 过滤不出null值】
为什么用pg数据库用 ! null 过滤不出null值 1. NULL 的特殊性质2. 为什么 ! null 无效3. 正确的过滤 NULL 的方式示例 4. 为什么 IS NULL 和 IS NOT NULL 有效5. 示例对比6. 总结 在 PostgreSQL 中,使用 ! null 过滤不出 NULL 值的原因与 SQL 标准中 NULL 的特殊性质…...
Classic Control Theory | 12 Real Poles or Zeros (第12课笔记-中文版)
笔记链接:https://m.tb.cn/h.Tt876SW?tkQaITejKxnFLhttps://m.tb.cn/h.Tt876SW?tkQaITejKxnFL...
Kubernetes开发环境minikube | 开发部署MySQL单节点应用
minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署MySQL单节点应用 minikube start --force kubectl get nodes 如上所示,启动minikube单节点运行环境 minikube ssh docker pull 如上所示,从MySQL官…...
大厂数据仓库数仓建模面试题及参考答案
目录 什么是数据仓库,和数据库有什么区别? 数据仓库的基本原理是什么? 数据仓库架构是怎样的? 数据仓库分层(层级划分),每层做什么?分层的好处是什么?数据分层是根据什么?数仓分层的原则与思路是什么? 数仓建模常用模型有哪些?区别、优缺点是什么?星型模型和雪…...
腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票
腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票 作者:某七年数据开发工程师 | 2025年02月23日 关键词:SQL窗口函数、连续问题、股票分析、腾讯面试题 一、问题背景与难点拆解 在股票量化分析场景中,"连续N天满足条件"是高频面试题类型。本题要求在单表stoc…...
安装可视化jar包部署平台JarManage
一、下载 下载地址:JarManage 发行版 - Gitee.com 🚒 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器,解压进入目录 🚚 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...
基于数据可视化+SpringBoot+安卓端的数字化OA公司管理平台设计和实现
博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…...
输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路
详细前端代码写于上一篇:输入搜索、分组展示选项、下拉选取,el-select 实现:即输入关键字检索,返回分组选项,选取跳转到相应内容页 —— VUE项目-全局模糊检索 【效果图】:分组展示选项 >【去界面操作体…...
性能巅峰对决:Rust vs C++ —— 速度、安全与权衡的艺术
??关注,带你探索Java的奥秘!?? ??超萌技术攻略,轻松晋级编程高手!?? ??技术宝库已备好,就等你来挖掘!?? ??订阅,智趣学习不孤单!?? ??即刻启航,编…...
unity学习53:UI的子容器:面板panel
目录 1 UI的最底层容器:canvas 1.1 UI的最底层容器:canvas 1.2 UI的合理结构 2 UI的子容器:面板panel 2.1 创建panel 2.2 面板的本质: image ,就是一个透明的图片,1个空容器 3 面板的属性 4 面板的…...
4-知识图谱的抽取与构建-4_2实体识别与分类
🌟 知识图谱的实体识别与分类🔥 🔍 什么是实体识别与分类? 实体识别(Entity Recognition)是从文本中提取出具体的事物,如人名、地名、组织名等。分类(Entity Classification&#x…...
elasticsearch在windows上的配置
写在最前面: 上资源 第一步 解压: 第二步 配置两个环境变量 第三步 如果是其他资源需要将标蓝的文件中的内容加一句 xpack.security.enabled: false 不同版本的yaml文件可能配置不同,末尾加这个 xpack.security.enabled: true打开bin目…...
详解分布式ID实践
引言 分布式ID,所谓的分布式ID,就是针对整个系统而言,任何时刻获取一个ID,无论系统处于何种情况,该值不会与之前产生的值重复,之后获取分布式ID时,也不会再获取到与其相同的值,它是…...
如何在 Vue 项目中为 `el-pagination` 设置中文
文章目录 前言1. 安装 Element Plus2. 引入中文语言包3. 配置中文语言环境4. 使用 el-pagination 组件5. 确保其他组件支持中文6. 语言切换(可选)总结 前言 在 Vue 项目中,Element Plus 是一个流行的 UI 组件库,它提供了许多常用…...
PostgreSQL:更新字段慢
目录标题 PostgreSQL 慢查询优化与 pg_stat_statements 使用1. 启用慢查询日志2. 使用 pg_stat_statements 扩展收集查询统计信息3. 查找执行时间较长的查询4. 分析慢查询的执行计划5. 优化查询6. 检查并发连接和系统资源7. 进一步优化8. 查看某条SQL1. **如何生成 query_id**2…...
【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 说句题外话,这篇文章一共5721个字,是我截至目前写的最长的一篇文章&a…...
【复习】Redis
数据结构 Redis常见的数据结构 String:缓存对象Hash:缓存对象、购物车List:消息队列Set:点赞、共同关注ZSet:排序 Zset底层? Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…...
STM32使用NRF2401进行数据传送
NRF2401是一款由Nordic Semiconductor公司生产的单片射频收发芯片,以下是关于它的详细介绍: 一、主要特点 工作频段:NRF2401工作于2.4~2.5GHz的ISM(工业、科学和医疗)频段,该频段无需申请即可使用…...
Fetch API 与 XMLHttpRequest:深入剖析异步请求的利器
Hi,我是布兰妮甜 !在现代 Web 开发中,异步通信是实现动态和交互式用户体验的基石。XMLHttpRequest (XHR) 作为老牌劲旅,曾一度统治着这一领域。然而,随着 Fetch API 的横空出世,开发者们迎来了一个更现代、…...
如何生成traceid以及可视化展示
根据你的需求,以下是一些可以生成唯一 traceId 并用于分布式链路追踪的工具和项目,这些项目支持生成唯一的 traceId,并将其用于日志记录和分布式追踪: 1. OpenTelemetry OpenTelemetry 是一个开源的观测框架,支持生成…...
【LeetCode541】反转字符串
题目描述 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前…...
DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由
为了让大家实现 DeepSeek 使用自由,今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版:DeepSeek官网与APP 首推,肯定是 DeepSeek 的官网和 APP,可以使用满血版 R1 和 V3 模型,以及联网功能。 网址: htt…...
C++:pthread线程分离和线程属性
在 C 的多线程编程中,pthread 库提供了强大的功能来管理线程。其中,线程分离和线程属性是两个重要的概念,它们对于优化线程的行为和资源管理有着关键作用。 线程分离 1.1 什么是线程分离 在 pthread 库中,线程有两种状态&#…...
Orange 开源项目 - 集成阿里云大模型
1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员,都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作,在5分钟内开发出一款大模型应用,或在几小时内训练…...
Docker 搭建 MySQL 数据库
Docker 搭建 MySQL 数据库 前言一、准备工作二、设置 MySQL 容器的目录结构三、配置 MySQL 容器四、自定义 MySQL 配置五、端口配置:Host 网络模式 vs Port 映射模式六、检查 MySQL 容器状态七、连接到 MySQL 容器八、备份与恢复总结 前言 在本篇文章中,…...
使用 Docker 部署 Flask 应用
使用 Docker 部署 Flask 应用 一、引言 在现代软件开发中,应用的部署和环境管理是至关重要的环节。传统的部署方式常常会遇到 “在我机器上能运行,在你机器上不行” 的问题,而 Docker 的出现很好地解决了这个痛点。Docker 是一个用于开发、部署和运行应用程序的开放平台,…...
公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)
数据简介:《中国城市统计NJ》从1985年开始,本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…...
python绘图之swarmplot分布散点图
swarmplot 是 Seaborn 提供的一种用于展示分类数据分布的散点图。它的主要作用是将数据点按照分类变量(通常是离散变量)进行分组,并在每个分类中以一种非重叠的方式展示数据点的位置。这种可视化方式可以帮助我们直观地理解数据在不同分类下的…...
KubeSphere平台安装
KubeSphere简介 KubeSphere 是一款功能强大的容器管理平台,以下是其简介: 1)基本信息 开源项目:基于 Apache-2.0 授权协议开源,由 Google Go、Groovy、HTML/CSS 和 Shell 等多种编程语言开发。基础架构:…...
