(牛客)小杜跑酷

news2024/11/13 10:12:53

链接: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不是n
                dp[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.coloradmin.cn/o/172548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shiro学习看这一篇文章就够了

第一章 Shiro简介 第1节 shiro介绍 1官网地址: http://shiro.apache.org/Apache Shiro 是一个功能强大,易于使用的Java安全框架,他执行认证、授权、加密、会话管理等功能,使用Shiro易于理解的API,使你能够轻松的保护任何应用,如移动端应用,大型web应用以及企业级应用. Shiro可…

当前主流的后端语言,谁能夺得桂冠,果然是后生可畏!

主流后端语言 如今编程语言遍地开花&#xff0c;烟花迷乱&#xff0c;小编整理了最流行的几种编程语言如下&#xff1a; 这几种语言都是经久不衰&#xff0c;占领着后端编程界的半壁江山。TIOBE上的语言排名&#xff1a; C、Java、python&#xff0c;C&#xff0c; C#鏖战榜首…

元宇宙浪潮下,数智人拒绝“标品”

作者 | 曾响铃 文 | 响铃说 在各地文博会、生活节等大型文娱活动上&#xff0c;在博物馆等各类场馆的线上平台&#xff0c;在企业与用户交互的窗口&#xff0c;在政务平台滚动政策宣讲片中&#xff0c;尤其是&#xff0c;在各大卫视的跨年晚会上…… 2022年末、2023年年初&a…

MyBatis Generator ORM层面的代码自动生成器

在日常开发工作中&#xff0c;我们往往需要自己去构建各种数据表所对应的持久化对象&#xff08;POJO&#xff09;、用于操作数据库的接口&#xff08;DAO&#xff09;以及跟 DAO 所绑定的对应 XML。这都是一些重复性的操作&#xff0c;不需要多大技术含量。MyBatis Generator工…

优思学院|Minitab中的子组大小应该怎样填写?

关于SPC中的均值极差控制图&#xff08;X-bar-R Chart&#xff09;&#xff0c;都是质量管理和六西格玛最常用的工具之一&#xff0c;学生经常都会问及SPC和子组的问题。 所谓的子组&#xff08;Subgroup&#xff09;&#xff0c;是指在同一组条件&#xff08;包括人、机、物、…

人工智能辅助药物发现(2)苗头化合物筛选

目录AI辅助苗头化合物筛选概述AI辅助CPICPI数据库蛋白质和化合物的特征表示深度学习CPI预测经典Y型架构基于注意力的架构基于复合物的架构CPI性能评估苗头化合物筛选的发展前景挑战与趋势实际应用AI辅助苗头化合物筛选概述 新型小分子药物的开发通常从生物学家确定疾病靶标开始…

oracle数据库初始化问题及处理方法记录

环境&#xff1a; 服务器装机是redhat7.9&#xff0b;oracle19&#xff0c;用户是oracle&#xff0c;用户组dba 装机后进行初始化&#xff1a; 1.配置oracle用户环境变量&#xff1a;~/.bash_profile export ORACLE_SIDxxx export ORACLE_BASE/oracle/app/oracle export OR…

海康visionmaster-在WPF中使用Winform控件的方法

描述 环境&#xff1a;VM4.0.0 VS2013及以上 现象&#xff1a;在算子SDK开发过程中&#xff0c;用户如何使用封装好的Winform模板匹配等控件&#xff1f; 解答 首先添加对如下两个dll文件的引用&#xff1a;WindowsFormsIntegration.dll&#xff0c;System.Windows.Forms.…

深入MySQL字符编码与对照规则

前言 本篇和大家一起深入MySQL的字符集与对照规则&#xff0c;剖析下我们存储在MySQL中的字段是如何进行存储和校验比对的。 先看问题&#xff1a;unique key为什么失效了&#xff1f;拉齐共识&#xff1a;回顾下字符编码的基础知识&#xff0c;回炉下ASCII和Unicode。深入了解…

算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点

算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点 二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度…

第三章 逻辑与推理

命题逻辑谓词逻辑知识图谱推理因果推理 3.1 命题逻辑 逻辑和推理是基于知识的操作。 命题逻辑是应用一套形式化规则对以符号表示的描述性陈述进行推理的系统。在命题逻辑中&#xff0c;一个或真或假的描述性陈述被称为原子命题&#xff0c;对原子命题的内部结构不做任何解析。…

UnityC#的lock用法简记

UnityC#的lock用法简记简述代码实例一、单线程二、多线程无lock三、多线程使用lock死锁注意拓展lock->InvokeMonitor参考链接简述 多线程环境中&#xff0c;不使用lock锁&#xff0c;会形成竞争条件&#xff0c;导致错误。 使用lock锁可以保证当有线程操作某个共享资源时&a…

【ONE·C || 操作符详解】

总言 C语言&#xff1a;各种操作符的使用介绍。 文章目录总言1、算术操作符2、移位操作符2.1、整体介绍2.2、左移操作符2.3、右移操作符&#xff08;逻辑右移、算术右移&#xff09;3、位操作符3.1、整体介绍3.2、演示实例3.2.1、按位与3.2.2、按位或3.2.3、按位异或3.2.4、按位…

离线文章画像计算--Tfidf计算

2.4.2 Tfidf计算 2.4.2.1 目的 计算出每篇文章的词语的TFIDF结果用于抽取画像 2.4.2.2TFIDF模型的训练步骤 读取N篇文章数据文章数据进行分词处理TFIDF模型训练保存&#xff0c;spark使用count与idf进行计算利用模型计算N篇文章数据的TFIDF值 2.4.2.3 实现 想要用TFIDF进行…

【数据结构初阶(Java)】认识时间复杂度和空间复杂度

目录 前言&#xff1a; 1、算法效率 2、时间复杂度 1、大O的渐近表示法&#xff08;不是一个准确的&#xff09; 2、时间复杂度练习题&#xff08;没有明确要求&#xff0c;计算的时间复杂度就是最坏情况下&#xff09; 3、空间复杂度 前言&#xff1a; 如何衡量一个算法的…

Java中多线程wait和notify的用法

目录 一、wait和notify/notifyAll的由来 二、wait()方法 三、notify方法 3.1 notify的作用 3.2 wait和notify的 相互转换代码图 3.3 notifyAll 四、为什么需要notify和wait都需要上锁&#xff1f; 五、wait和sleep的对比 前言&#xff1a;由于线程之间是抢占式执行的&a…

Linux常用命令——tftp命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tftp 在本机和tftp服务器之间使用TFTP协议传输文件 补充说明 tftp命令用在本机和tftp服务器之间使用TFTP协议传输文件。 TFTP是用来下载远程文件的最简单网络协议&#xff0c;它其于UDP协议而实现。嵌入式linu…

RTMP协议封装H264和H265协议详解

RTMP协议封装H264和H265协议详解 文章目录RTMP协议封装H264和H265协议详解1 RTMP和FLV2 RTMP协议封装H264视频流2.1 RTMP发送AVC sequence header2.2 RTMP发送AVCC视频帧数据‘3 RTMP协议封装H265视频流1 RTMP和FLV 有关RTMP和FLV格式详细介绍可查看如下文章&#xff1a; http…

2022 Moonbeam的点点滴滴离不开社区支持

Moonbeam成为首个上线波卡的平行链已经有一周年&#x1f382;啦&#xff0c;这是一段疯狂的旅程&#x1f3cd;。 为了纪念这一时刻&#xff0c;我们通过公开数据来回顾这一年的众多里程碑、更新和整体发生的一切。 让我们来回顾一下Moonbeam在2022年取得了哪些成就吧。 &…

GIS二维电子地图开发总结

二维平面地图&#xff0c;目前支撑设备渲染&#xff0c;真实场景&#xff0c;后期电子围栏&#xff0c;运动轨迹等业务需求做铺垫 一、所涉及的技术栈&#xff1a; 1.Openlayers,加载渲染地图 2.Geoserver 发布wms和wfs&#xff08;&#xff09;服务 3.Arcgis,Arcmap,进行源文件…