(牛客)小杜跑酷

news/2023/6/6 23:51:25

链接:https://ac.nowcoder.com/acm/contest/49244/F?&headNav=acm
来源:牛客网

题目描述
小杜又在玩游戏了!这回他玩的是跑酷游戏!
已知该跑酷地图长为n,有3层,可以理解为一张3×n的地图。令人新奇的是,这张跑酷地图有一些弹射机关。假设玩家现在位置为(x,y)(x,y)。
每一秒钟,如果玩家没有踩到机关,玩家可以正常向前移动一格;如果玩家踩到机关,即当前玩家位置上存在一个机关,弹射机关会立即随机触发以下一种状态:

  1. 上升:将玩家向上向前弹射一格,即将玩家瞬间移动到( max(1,x-1) , y+1 )(max(1,x−1),y+1);
  2. 跳跃:将玩家向前弹射两格,即将玩家瞬间移动到( x , min(n,y+2) )(x,min(n,y+2));
  3. 下降:将玩家向下向前弹射一格,即将玩家瞬间移动到( min(3,x+1) , y+1 )(min(3,x+1),y+1)。
    如下图所示。

在这里插入图片描述

已知小杜起始位于(1,1)(1,1),求小杜最终到达(1,n)(1,n), (2,n)(2,n), (3,n)(3,n)的方案数(对998244353取模)。
(如果两种方案被认为是不同的,那么至少存在一个机关,触发的状态不同)

输入描述:
第一行包括n,m\ (2≤ n≤ 10^9,1≤ m≤ 5*10^5)n,m (2≤n≤10
9
,1≤m≤5∗10
5
),分别表示跑酷地图的长度和其中包含的机关个数;
接下去m行,每行包括两个正整数x,y\ (1≤ x≤ 3,1≤ y≤ n-1)x,y (1≤x≤3,1≤y≤n−1),代表弹射机关的位置在(x,y)(x,y)(保证任意两个机关位置不同)。

输出描述:
输出三行三个正整数,第ii行代表最终到达(i,n)(i,n)的方案数,答案对 998244353 取模。
示例1
输入
复制
16 4
1 3
2 7
3 11
2 15
输出
复制
5
2
4
示例2
输入
复制
10 1
1 9
输出
复制
2
1
0

思路 :

  • 考虑动态规划,先将机关按y值排序,考虑经过(x,y)的方案数,容易推导出:
  • 如果该位置有机关, dp[max(1,x-1)][min(n,y+1)]+=dp[x][y], dp[min(3,x+1)][min(n,y+1)]+=dp[x][y], dp[x][min(n,y+2)]+=dp[x][y]; 如果该位置没有机关, dp[x][min(n,y+1)]+=dp[x][y] ;
  • 但是,这边的n有10^9,因此我们只需要考虑有机关的dp值。当该单元格不存在机关时,我们可以直接将该单元格的值传递到同层的后一个机关处,将每层机关排序预处理,可以使用二分直接找到后一个机关的位置。 时间复杂度O(mlogm)
  • dp转移时,只需要考虑那些有机关的,以及会被机关转移到的地方,其余地方都为0
#include <iostream>
#include <array>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = 998244353;int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int n, m;cin >> n >> m;vector<array<int, 2>> traps(m + 1);vector<int> nums;for (int i = 0; i < m; ++ i) {cin >> traps[i][0] >> traps[i][1];nums.push_back(min(traps[i][1], n));nums.push_back(min(traps[i][1] + 1, n));nums.push_back(min(traps[i][1] + 2, n));}sort(nums.begin(), nums.end());nums.erase(unique(nums.begin(), nums.end()), nums.end());int siz = (int)nums.size();auto id = [&](int v) {return lower_bound(nums.begin(), nums.end(), v) - nums.begin() + 1;};vector<vector<bool>> h(4, vector<bool>(siz + 3, 0));vector<vector<ll>> dp(4, vector<ll>(siz + 3, 0));for (int i = 0; i < m; ++ i) {h[traps[i][0]][id(traps[i][1])] = 1;}dp[1][1] = 1; // 方案数for (int i = 1; i <= siz - 1; ++ i) {for (int j = 1; j <= 3; ++ j) {if (h[j][i]) {dp[max(1, j - 1)][i + 1] = (dp[max(1, j - 1)][i + 1] + dp[j][i]) % mod;// 注意是siz不是ndp[j][min(siz, i + 2)] = (dp[j][min(siz, i + 2)] + dp[j][i]) % mod;dp[min(3, j + 1)][i + 1] = (dp[min(3, j + 1)][i + 1] + dp[j][i]) % mod;} else {dp[j][i + 1] = (dp[j][i + 1] + dp[j][i]) % mod;}}}cout << dp[1][siz] << '\n' << dp[2][siz] << '\n' << dp[3][siz];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4567482.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

HTMLCSS(简单表单标签的制作)

表单标签的基本属性 input type “text” 文本输入框 value设置默认显示内容 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title>HTML &&CSS</title> </head><body><form&g…

IDEA中输入sout回车后得到的是println如何解决

新手用IDEA写代码&#xff0c;输入sout并回车后得到的是println或者其他该如何解决&#xff0c;手把手教你如何设置 一、点击左上角 File&#xff0c;再点击Settings... 二、在搜索栏输入sout则会得到下图&#xff0c;要确保前面的勾是勾上的&#xff0c;并且在下方的文本框中…

后端修行 - idea中Tomcat无法启动成功

兄弟篇 tomcat的运行方式、乱码解决、启动效果 Tomcat Tomcat刚启动&#xff0c;报出端口被占用问题1:Tomcat刚启动也就一两秒的时间&#xff0c;报出端口被占用 java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: …

idea搭建ssm框架

一直不会用idea&#xff0c;咋用咋难受&#xff0c;ssm框架一直搭建不好&#xff0c;可又一直想用&#xff0c;毕竟强大。 在eclipse上好好的框架&#xff0c;在idea上就不能用。好不容易搭成功了。保存备用。 项目目录如下&#xff1a; 步骤省略&#xff0c;直接上配置文件&a…

IDEA搭建SpringMVC并用maven配置的实战demo

1、用idea创建maven一个项目 此时已经创建好一个maven目录了 2、添加maven依赖 maven依赖代码如下&#xff0c;大致需要的包如下&#xff08;表较全&#xff09;&#xff0c;根据不同的需求可以添加不同的依赖 <?xml version"1.0" encoding"UTF-8"?…

IDEA搭建SSM框架步骤

IDEA搭建SSM框架步骤 首先你的IDEA需要有以下几个东西 jdk.1.8版本mavenidea2017 如果你有这些东西的话可以开始下一步。 1.打开IDEA-找到file选项->new->project 2.在NEW PROJECT中找到MAVEN项目。勾选上CTEATE FROM ARCHTYPE&#xff08;从原型创建&#xff09;。选…

使用Intellij IDEA来发SpringMVC网站(二)

注意&#xff1a;承接上一文&#xff1a;使用IntelliJ IDEA开发SpringMVC网站&#xff08;一&#xff09;开发环境 五、SpringMVC框架配置 进行完上面的配置&#xff0c;那就说明现在基本的开发环境已经搭建好了&#xff0c;现在要开始进行SpringMVC的网站开发。 1、web.xml配…

IntelliJ IDEA创建Spring SpringMVC MyBatis整合Maven项目,并提交至Github

IntelliJ IDEA创建Spring SpringMVC MyBatis整合Maven项目&#xff0c;并提交至Github 本文小博将写一篇IDEA创建SSMMaven整合项目&#xff0c;并提交至Github的教程。较为基础&#xff0c;大神勿喷。原创博客&#xff0c;转载请注明来源。 ①新建Maven项目&#xff0c;如下图…