火车站 题解

题目传送门

题目背景

有一个奇奇怪怪的火车站,奇奇怪怪的站长JTZ想要解决一个奇奇怪怪的问题。

题目描述

现在有 N 列火车要进出站,对于同一列车进站和出站有且只有一次鸣笛,笛声有 1M 种音调,要求相邻的两次鸣笛之间音调的差的绝对值不能小于 K (不鸣笛笛声音调看作1e100 )。不然耳朵不好的车站管理员XYH分不清楚是哪一列车,现在XYH给出了每一列火车的进出,JTZ想知道总共有多少种鸣笛的方案,而他又不想太麻烦,所以只需要方案数除以 43621789 的余数。
某中学八年级大佬RSJ知道了这个消息后,觉得太简单了,几下算出了结果 x (取余数后)。于是他想让你算出 Mxmod43621789

输入格式

第一行三个整数 N,M,K
第二行有 2N 个整数,每个整数是 01 代表车进站和出站,保证数据合法,也就是说当车站没有车的时候没有车出站,最后车站没有车。

输出格式

一行,表示答案。( Mxmod43621789 )

输入输出样例

输入#1

2 1 0
0 0 1 1

输出#1

1

输入#2

3 5 2
0 0 0 1 1 1

输出#2

40308287

提示/说明

图非常重要

样例解释:

样例1: x=4,M=1 答案为 14mod43621789=1
样例2: x=250,M=5 答案为 5250mod43621789=40308287

数据范围

本题采用 Subtask
Subtask 1: 测试点 15 30% N3,M7
Subtask 2: 测试点 612 40% N100M7
Subtask 3: 测试点 1320 40% N500,M7
你只有通过每个 Subtask 的所有测试点才能获得该 Subtask 的分值。


题目解析

这道题目的出题灵感来自于CF149D。我们只要把火车进站看成左括号,火车出站看成右括号。其实应该是栈。
排列与组合是行不通的,因为对于同一列车进站和出站有且只有一次鸣笛,由于没有要求输出步骤,又可以搜索,考虑DP。无疑是区间DP,因为对于鸣笛的音调会影响到其他的方案数量,那么需要将左右侧的鸣笛音调列入方程转移式。
令函数 f(i,j,x,y) 为区间 [i,j] 中,左右端点中,左端点的鸣笛音调为 x ,右端点的鸣笛音调为 y 的种数。不鸣笛记为 0 。分两种情况考虑。
我们需要预处理出辆火车的进出站,存在数组里,要求能 Θ(1) 查询。
情况一:第 i j 次进出站时相同的车。
那么我们需要枚举 i,j 的音调以及相邻的 i+1,j1 的音调,并且要保证数据合法。

f(i,j,x,y)=f(i+1,j1,a,b)

其中 |ax|k 或者 x=0,a0 或者 x0,a=0
并且 |by|k 或者 b=0,y0 或者 b0,y=0
并且 x=0,y0 或者 x0,y0

情况二:第 i j 次进出站时不是相同的车。
设第 i 辆车的出站为 mid ,那么就可以将区间 [i,j] 分割成区间 [i,mid],[mid+1,j] ,然后枚举四个端点音调的即可,也要保证数据合法。

f(i,j,x,y)=f(i,mid,x,a)×f(mid+1,b,y)

其中 |ab|x 或者 a=0,b0 或者 a0,b=0
并且 x=0,a0x0,a=0 (因为 x,a 同一辆车)

最后注意一些细节就可以了。
算法复杂度是 Θ(N2M4+N) 的,虽然可以优化成 Θ(N2M3+N) 但是因为我懒所以我就不写了。

最后记得输出 Mxmod43621789 ,记得加上快速幂和 long long。

posted @   jiangtaizhe001  阅读(85)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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工具
点击右上角即可分享
微信分享提示