火车站 题解
题目背景
有一个奇奇怪怪的火车站,奇奇怪怪的站长JTZ想要解决一个奇奇怪怪的问题。
题目描述
现在有 列火车要进出站,对于同一列车进站和出站有且只有一次鸣笛,笛声有 种音调,要求相邻的两次鸣笛之间音调的差的绝对值不能小于 (不鸣笛笛声音调看作 )。不然耳朵不好的车站管理员XYH分不清楚是哪一列车,现在XYH给出了每一列火车的进出,JTZ想知道总共有多少种鸣笛的方案,而他又不想太麻烦,所以只需要方案数除以 的余数。
某中学八年级大佬RSJ知道了这个消息后,觉得太简单了,几下算出了结果 (取余数后)。于是他想让你算出 。
输入格式
第一行三个整数 。
第二行有 个整数,每个整数是 或 代表车进站和出站,保证数据合法,也就是说当车站没有车的时候没有车出站,最后车站没有车。
输出格式
一行,表示答案。( )
输入输出样例
输入#1
2 1 0 0 0 1 1
输出#1
1
输入#2
3 5 2 0 0 0 1 1 1
输出#2
40308287
提示/说明
图非常重要
样例解释:
样例1: 答案为
样例2: 答案为
数据范围
本题采用 Subtask
: 测试点
: 测试点
: 测试点
你只有通过每个 的所有测试点才能获得该 的分值。
题目解析
这道题目的出题灵感来自于CF149D。我们只要把火车进站看成左括号,火车出站看成右括号。其实应该是栈。
排列与组合是行不通的,因为对于同一列车进站和出站有且只有一次鸣笛,由于没有要求输出步骤,又可以搜索,考虑DP。无疑是区间DP,因为对于鸣笛的音调会影响到其他的方案数量,那么需要将左右侧的鸣笛音调列入方程转移式。
令函数 为区间 中,左右端点中,左端点的鸣笛音调为 ,右端点的鸣笛音调为 的种数。不鸣笛记为 。分两种情况考虑。
我们需要预处理出辆火车的进出站,存在数组里,要求能 查询。
情况一:第 次进出站时相同的车。
那么我们需要枚举 的音调以及相邻的 的音调,并且要保证数据合法。
其中 或者 或者
并且 或者 或者
并且 或者
情况二:第 次进出站时不是相同的车。
设第 辆车的出站为 ,那么就可以将区间 分割成区间 ,然后枚举四个端点音调的即可,也要保证数据合法。
其中 或者 或者
并且 且 (因为 同一辆车)
最后注意一些细节就可以了。
算法复杂度是 的,虽然可以优化成 但是因为我懒所以我就不写了。
最后记得输出 ,记得加上快速幂和 long long。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具